<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Interactive BOM for KiCAD</title>
  <style type="text/css">
:root {
  --pcb-edge-color: black;
  --pad-color: #878787;
  --pad-color-highlight: #D04040;
  --pin1-outline-color: #ffb629;
  --pin1-outline-color-highlight: #b4ff03;
  --silkscreen-edge-color: #aa4;
  --silkscreen-polygon-color: #4aa;
  --silkscreen-text-color: #4aa;
  --fabrication-edge-color: #907651;
  --fabrication-polygon-color: #907651;
  --fabrication-text-color: #a27c24;
  --track-color: #def5f1;
  --track-color-highlight: #D04040;
  --zone-color: #def5f1;
  --zone-color-highlight: #d0404080;
}

html, body {
  margin: 0px;
  height: 100%;
  font-family: Verdana, sans-serif;
}

.dark.topmostdiv {
  --pcb-edge-color: #eee;
  --pad-color: #808080;
  --pin1-outline-color: #ffa800;
  --pin1-outline-color-highlight: #ccff00;
  --track-color: #42524f;
  --zone-color: #42524f;
  background-color: #252c30;
  color: #eee;
}

button {
  background-color: #eee;
  border: 1px solid #888;
  color: black;
  height: 44px;
  width: 44px;
  text-align: center;
  text-decoration: none;
  display: inline-block;
  font-size: 14px;
  font-weight: bolder;
}

.dark button {
  /* This will be inverted */
  background-color: #c3b7b5;
}

button.depressed {
  background-color: #0a0;
  color: white;
}

.dark button.depressed {
  /* This will be inverted */
  background-color: #b3b;
}

button:focus {
  outline: 0;
}

button#tb-btn {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' fill='none' stroke='%23000' stroke-width='.4' stroke-linejoin='round'/%3E%3Cpath d='M1.32 290.12h5.82M1.32 291.45h5.82' fill='none' stroke='%23000' stroke-width='.4'/%3E%3Cpath d='M4.37 292.5v4.23M.26 292.63H8.2' fill='none' stroke='%23000' stroke-width='.3'/%3E%3Ctext font-weight='700' font-size='3.17' font-family='sans-serif'%3E%3Ctspan x='1.35' y='295.73'%3EF%3C/tspan%3E%3Ctspan x='5.03' y='295.68'%3EB%3C/tspan%3E%3C/text%3E%3C/g%3E%3C/svg%3E%0A");
}

button#lr-btn {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' fill='none' stroke='%23000' stroke-width='.4' stroke-linejoin='round'/%3E%3Cpath d='M1.06 290.12H3.7m-2.64 1.33H3.7m-2.64 1.32H3.7m-2.64 1.3H3.7m-2.64 1.33H3.7' fill='none' stroke='%23000' stroke-width='.4'/%3E%3Cpath d='M4.37 288.8v7.94m0-4.11h3.96' fill='none' stroke='%23000' stroke-width='.3'/%3E%3Ctext font-weight='700' font-size='3.17' font-family='sans-serif'%3E%3Ctspan x='5.11' y='291.96'%3EF%3C/tspan%3E%3Ctspan x='5.03' y='295.68'%3EB%3C/tspan%3E%3C/text%3E%3C/g%3E%3C/svg%3E%0A");
}

button#bom-btn {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8.47 8.47'%3E%3Crect transform='translate(0 -288.53)' ry='1.17' y='288.8' x='.27' height='7.94' width='7.94' fill='%23f9f9f9'/%3E%3Cg transform='translate(0 -288.53)' fill='none' stroke='%23000' stroke-width='.4'%3E%3Crect width='7.94' height='7.94' x='.27' y='288.8' ry='1.17' stroke-linejoin='round'/%3E%3Cpath d='M1.59 290.12h5.29M1.59 291.45h5.33M1.59 292.75h5.33M1.59 294.09h5.33M1.59 295.41h5.33'/%3E%3C/g%3E%3C/svg%3E");
}

button#bom-grouped-btn {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg stroke='%23000' stroke-linejoin='round' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-linecap='square' stroke-width='2' d='M6 10h4m4 0h5m4 0h3M6.1 22h3m3.9 0h5m4 0h4m-16-8h4m4 0h4'/%3E%3Cpath stroke-linecap='null' d='M5 17.5h22M5 26.6h22M5 5.5h22'/%3E%3C/g%3E%3C/svg%3E");
}

button#bom-ungrouped-btn {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg stroke='%23000' stroke-linejoin='round' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-linecap='square' stroke-width='2' d='M6 10h4m-4 8h3m-3 8h4'/%3E%3Cpath stroke-linecap='null' d='M5 13.5h22m-22 8h22M5 5.5h22'/%3E%3C/g%3E%3C/svg%3E");
}

button#bom-netlist-btn {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32'%3E%3Cg fill='none' stroke='%23000' class='layer'%3E%3Crect width='29' height='29' x='1.5' y='1.5' stroke-width='2' fill='%23fff' rx='5' ry='5'/%3E%3Cpath stroke-width='2' d='M6 26l6-6v-8m13.8-6.3l-6 6v8'/%3E%3Ccircle cx='11.8' cy='9.5' r='2.8' stroke-width='2'/%3E%3Ccircle cx='19.8' cy='22.8' r='2.8' stroke-width='2'/%3E%3C/g%3E%3C/svg%3E");
}

button#copy {
  background-image: url("data:image/svg+xml,%3Csvg height='48' viewBox='0 0 48 48' width='48' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M0 0h48v48h-48z' fill='none'/%3E%3Cpath d='M32 2h-24c-2.21 0-4 1.79-4 4v28h4v-28h24v-4zm6 8h-22c-2.21 0-4 1.79-4 4v28c0 2.21 1.79 4 4 4h22c2.21 0 4-1.79 4-4v-28c0-2.21-1.79-4-4-4zm0 32h-22v-28h22v28z'/%3E%3C/svg%3E");
  background-position: 6px 6px;
  background-repeat: no-repeat;
  background-size: 26px 26px;
  border-radius: 6px;
  height: 40px;
  width: 40px;
  margin: 10px 5px;
}

button#copy:active {
    box-shadow: inset 0px 0px 5px #6c6c6c;
}

textarea.clipboard-temp {
  position: fixed;
  top: 0;
  left: 0;
  width: 2em;
  height: 2em;
  padding: 0;
  border: None;
  outline: None;
  box-shadow: None;
  background: transparent;
}

.left-most-button {
  border-right: 0;
  border-top-left-radius: 6px;
  border-bottom-left-radius: 6px;
}

.middle-button {
  border-right: 0;
}

.right-most-button {
  border-top-right-radius: 6px;
  border-bottom-right-radius: 6px;
}

.button-container {
  font-size: 0;
  margin: 10px 10px 10px 0px;
}

.dark .button-container {
  filter: invert(1);
}

.button-container button {
  background-size: 32px 32px;
  background-position: 5px 5px;
  background-repeat: no-repeat;
}

@media print {
  .hideonprint {
    display: none;
  }
}

canvas {
  cursor: crosshair;
}

canvas:active {
  cursor: grabbing;
}

.fileinfo {
  width: 100%;
  max-width: 1000px;
  border: none;
  padding: 5px;
}

.fileinfo .title {
  font-size: 20pt;
  font-weight: bold;
}

.fileinfo td {
  overflow: hidden;
  white-space: nowrap;
  max-width: 1px;
  width: 50%;
  text-overflow: ellipsis;
}

.bom {
  border-collapse: collapse;
  font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
  font-size: 10pt;
  table-layout: fixed;
  width: 100%;
  margin-top: 1px;
}

.bom th, .bom td {
  border: 1px solid black;
  padding: 5px;
  word-wrap: break-word;
  text-align: center;
  position: relative;
}

.dark .bom th, .dark .bom td {
  border: 1px solid #777;
}

.bom th {
  background-color: #CCCCCC;
  background-clip: padding-box;
}

.dark .bom th {
  background-color: #3b4749;
}

.bom tr.highlighted:nth-child(n) {
  background-color: #cfc;
}

.dark .bom tr.highlighted:nth-child(n) {
  background-color: #226022;
}

.bom tr:nth-child(even) {
  background-color: #f2f2f2;
}

.dark .bom tr:nth-child(even) {
  background-color: #313b40;
}

.bom tr.checked {
  color: #aaa;
}

.dark .bom tr.checked {
  color: #666;
}

.bom tr {
  transition: background-color 0.2s;
}

.bom .numCol {
  width: 25px;
}

.bom .Description {
  width: 10%;
}

.bom .Part {
  width: 10%;
}

.bom .Value {
  width: 15%;
}

.bom .Quantity {
  width: 65px;
}

.bom th .sortmark {
  position: absolute;
  right: 1px;
  top: 1px;
  margin-top: -5px;
  border-width: 5px;
  border-style: solid;
  border-color: transparent transparent #221 transparent;
  transform-origin: 50% 85%;
  transition: opacity 0.2s, transform 0.4s;
}

.dark .bom th .sortmark {
  filter: invert(1);
}

.bom th .sortmark.none {
  opacity: 0;
}

.bom th .sortmark.desc {
  transform: rotate(180deg);
}

.bom th:hover .sortmark.none {
  opacity: 0.5;
}

.bom .bom-checkbox {
  width: 30px;
  position: relative;
  user-select: none;
  -moz-user-select: none;
}

.bom .bom-checkbox:before {
  content: "";
  position: absolute;
  border-width: 15px;
  border-style: solid;
  border-color: #51829f transparent transparent transparent;
  visibility: hidden;
  top: -15px;
}

.bom .bom-checkbox:after {
  content: "Double click to set/unset all";
  position: absolute;
  color: white;
  top: -35px;
  left: -26px;
  background: #51829f;
  padding: 5px 15px;
  border-radius: 8px;
  white-space: nowrap;
  visibility: hidden;
}

.bom .bom-checkbox:hover:before, .bom .bom-checkbox:hover:after {
  visibility: visible;
  transition: visibility 0.2s linear 1s;
}

.split {
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
  overflow-y: auto;
  overflow-x: hidden;
  background-color: inherit;
}

.split.split-horizontal, .gutter.gutter-horizontal {
  height: 100%;
  float: left;
}

.gutter {
  background-color: #ddd;
  background-repeat: no-repeat;
  background-position: 50%;
  transition: background-color 0.3s;
}

.dark .gutter {
  background-color: #777;
}

.gutter.gutter-horizontal {
  background-image: url('');
  cursor: ew-resize;
  width: 5px;
}

.gutter.gutter-vertical {
  background-image: url('');
  cursor: ns-resize;
  height: 5px;
}

.searchbox {
  float: left;
  height: 40px;
  margin: 10px 5px;
  padding: 12px 32px;
  font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
  font-size: 18px;
  box-sizing: border-box;
  border: 1px solid #888;
  border-radius: 6px;
  outline: none;
  background-color: #eee;
  transition: background-color 0.2s, border 0.2s;
  background-image: url('');
  background-position: 10px 10px;
  background-repeat: no-repeat;
}

.dark .searchbox {
  background-color: #111;
  color: #eee;
}

.searchbox::placeholder {
  color: #ccc;
}

.dark .searchbox::placeholder {
  color: #666;
}

.filter {
  width: calc(60% - 64px);
}

.reflookup {
  width: calc(40% - 10px);
}

input[type=text]:focus {
  background-color: white;
  border: 1px solid #333;
}

.dark input[type=text]:focus {
  background-color: #333;
  border: 1px solid #ccc;
}

mark.highlight {
  background-color: #5050ff;
  color: #fff;
  padding: 2px;
  border-radius: 6px;
}

.dark mark.highlight {
  background-color: #76a6da;
  color: #111;
}

.menubtn {
  background-color: white;
  border: none;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='36' viewBox='0 0 20 20'%3E%3Cpath fill='none' d='M0 0h20v20H0V0z'/%3E%3Cpath d='M15.95 10.78c.03-.25.05-.51.05-.78s-.02-.53-.06-.78l1.69-1.32c.15-.12.19-.34.1-.51l-1.6-2.77c-.1-.18-.31-.24-.49-.18l-1.99.8c-.42-.32-.86-.58-1.35-.78L12 2.34c-.03-.2-.2-.34-.4-.34H8.4c-.2 0-.36.14-.39.34l-.3 2.12c-.49.2-.94.47-1.35.78l-1.99-.8c-.18-.07-.39 0-.49.18l-1.6 2.77c-.1.18-.06.39.1.51l1.69 1.32c-.04.25-.07.52-.07.78s.02.53.06.78L2.37 12.1c-.15.12-.19.34-.1.51l1.6 2.77c.1.18.31.24.49.18l1.99-.8c.42.32.86.58 1.35.78l.3 2.12c.04.2.2.34.4.34h3.2c.2 0 .37-.14.39-.34l.3-2.12c.49-.2.94-.47 1.35-.78l1.99.8c.18.07.39 0 .49-.18l1.6-2.77c.1-.18.06-.39-.1-.51l-1.67-1.32zM10 13c-1.65 0-3-1.35-3-3s1.35-3 3-3 3 1.35 3 3-1.35 3-3 3z'/%3E%3C/svg%3E%0A");
  background-position: center;
  background-repeat: no-repeat;
}

.statsbtn {
  background-color: white;
  border: none;
  background-image: url("data:image/svg+xml,%3Csvg width='36' height='36' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M4 6h28v24H4V6zm0 8h28v8H4m9-16v24h10V5.8' fill='none' stroke='%23000' stroke-width='2'/%3E%3C/svg%3E");
  background-position: center;
  background-repeat: no-repeat;
}

.iobtn {
  background-color: white;
  border: none;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='36' height='36'%3E%3Cpath fill='none' stroke='%23000' stroke-width='2' d='M3 33v-7l6.8-7h16.5l6.7 7v7H3zM3.2 26H33M21 9l5-5.9 5 6h-2.5V15h-5V9H21zm-4.9 0l-5 6-5-6h2.5V3h5v6h2.5z'/%3E%3Cpath fill='none' stroke='%23000' d='M6.1 29.5H10'/%3E%3C/svg%3E");
  background-position: center;
  background-repeat: no-repeat;
}

.dark .statsbtn, .dark .savebtn, .dark .menubtn, .dark .iobtn {
  filter: invert(1);
}

.flexbox {
  display: flex;
  align-items: center;
  justify-content: space-between;
  width: 100%;
}

.savebtn {
  background-color: #d6d6d6;
  width: auto;
  height: 30px;
  flex-grow: 1;
  margin: 5px;
  border-radius: 4px;
}

.savebtn:active {
  background-color: #0a0;
  color: white;
}

.dark .savebtn:active {
  /* This will be inverted */
  background-color: #b3b;
}

.stats {
  border-collapse: collapse;
  font-size: 12pt;
  table-layout: fixed;
  width: 100%;
  min-width: 450px;
}

.dark .stats td {
  border: 1px solid #bbb;
}

.stats td {
  border: 1px solid black;
  padding: 5px;
  word-wrap: break-word;
  text-align: center;
  position: relative;
}

#checkbox-stats div {
  position: absolute;
  left: 0;
  top: 0;
  height: 100%;
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: center;
}

#checkbox-stats .bar {
  background-color: rgba(28, 251, 0, 0.6);
}

.menu {
  position: relative;
  display: inline-block;
  margin: 10px 10px 10px 0px;
}

.menu-content {
  display: none;
  position: absolute;
  background-color: white;
  right: 0;
  min-width: 300px;
  box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2);
  z-index: 100;
  padding: 8px;
}

.dark .menu-content {
  background-color: #111;
}

.menu:hover .menu-content {
  display: block;
}

.menu:hover .menubtn, .menu:hover .iobtn, .menu:hover .statsbtn {
  background-color: #eee;
}

.menu-label {
  display: inline-block;
  padding: 8px;
  border: 1px solid #ccc;
  border-top: 0;
  width: calc(100% - 18px);
}

.menu-label-top {
  border-top: 1px solid #ccc;
}

.menu-textbox {
  float: left;
  height: 24px;
  margin: 10px 5px;
  padding: 5px 5px;
  font-family: Consolas, "DejaVu Sans Mono", Monaco, monospace;
  font-size: 14px;
  box-sizing: border-box;
  border: 1px solid #888;
  border-radius: 4px;
  outline: none;
  background-color: #eee;
  transition: background-color 0.2s, border 0.2s;
  width: calc(100% - 10px);
}

.menu-textbox.invalid, .dark .menu-textbox.invalid {
  color: red;
}

.dark .menu-textbox {
  background-color: #222;
  color: #eee;
}

.radio-container {
  margin: 4px;
}

.topmostdiv {
  width: 100%;
  height: 100%;
  background-color: white;
  transition: background-color 0.3s;
}

#top {
  height: 78px;
  border-bottom: 2px solid black;
}

.dark #top {
  border-bottom: 2px solid #ccc;
}

#dbg {
  display: block;
}

::-webkit-scrollbar {
  width: 8px;
}

::-webkit-scrollbar-track {
  background: #aaa;
}

::-webkit-scrollbar-thumb {
  background: #666;
  border-radius: 3px;
}

::-webkit-scrollbar-thumb:hover {
  background: #555;
}

.slider {
  -webkit-appearance: none;
  width: 100%;
  margin: 3px 0;
  padding: 0;
  outline: none;
  opacity: 0.7;
  -webkit-transition: .2s;
  transition: opacity .2s;
  border-radius: 3px;
}

.slider:hover {
  opacity: 1;
}

.slider:focus {
  outline: none;
}

.slider::-webkit-slider-runnable-track {
  -webkit-appearance: none;
  width: 100%;
  height: 8px;
  background: #d3d3d3;
  border-radius: 3px;
  border: none;
}

.slider::-webkit-slider-thumb {
  -webkit-appearance: none;
  width: 15px;
  height: 15px;
  border-radius: 50%;
  background: #0a0;
  cursor: pointer;
  margin-top: -4px;
}

.dark .slider::-webkit-slider-thumb {
  background: #3d3;
}

.slider::-moz-range-thumb {
  width: 15px;
  height: 15px;
  border-radius: 50%;
  background: #0a0;
  cursor: pointer;
}

.slider::-moz-range-track {
  height: 8px;
  background: #d3d3d3;
  border-radius: 3px;
}

.dark .slider::-moz-range-thumb {
  background: #3d3;
}

.slider::-ms-track {
  width: 100%;
  height: 8px;
  border-width: 3px 0;
  background: transparent;
  border-color: transparent;
  color: transparent;
  transition: opacity .2s;
}

.slider::-ms-fill-lower {
  background: #d3d3d3;
  border: none;
  border-radius: 3px;
}

.slider::-ms-fill-upper {
  background: #d3d3d3;
  border: none;
  border-radius: 3px;
}

.slider::-ms-thumb {
  width: 15px;
  height: 15px;
  border-radius: 50%;
  background: #0a0;
  cursor: pointer;
  margin: 0;
}

.shameless-plug {
  font-size: 0.8em;
  text-align: center;
  display: block;
}

a {
  color: #0278a4;
}

.dark a {
  color: #00b9fd;
}

#frontcanvas, #backcanvas {
    touch-action: none;
}


  </style>
  <script type="text/javascript" >
///////////////////////////////////////////////
/*
  Split.js - v1.3.5
  MIT License
  https://github.com/nathancahill/Split.js
*/
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.Split=t()}(this,function(){"use strict";var e=window,t=e.document,n="addEventListener",i="removeEventListener",r="getBoundingClientRect",s=function(){return!1},o=e.attachEvent&&!e[n],a=["","-webkit-","-moz-","-o-"].filter(function(e){var n=t.createElement("div");return n.style.cssText="width:"+e+"calc(9px)",!!n.style.length}).shift()+"calc",l=function(e){return"string"==typeof e||e instanceof String?t.querySelector(e):e};return function(u,c){function z(e,t,n){var i=A(y,t,n);Object.keys(i).forEach(function(t){return e.style[t]=i[t]})}function h(e,t){var n=B(y,t);Object.keys(n).forEach(function(t){return e.style[t]=n[t]})}function f(e){var t=E[this.a],n=E[this.b],i=t.size+n.size;t.size=e/this.size*i,n.size=i-e/this.size*i,z(t.element,t.size,this.aGutterSize),z(n.element,n.size,this.bGutterSize)}function m(e){var t;this.dragging&&((t="touches"in e?e.touches[0][b]-this.start:e[b]-this.start)<=E[this.a].minSize+M+this.aGutterSize?t=E[this.a].minSize+this.aGutterSize:t>=this.size-(E[this.b].minSize+M+this.bGutterSize)&&(t=this.size-(E[this.b].minSize+this.bGutterSize)),f.call(this,t),c.onDrag&&c.onDrag())}function g(){var e=E[this.a].element,t=E[this.b].element;this.size=e[r]()[y]+t[r]()[y]+this.aGutterSize+this.bGutterSize,this.start=e[r]()[G]}function d(){var t=this,n=E[t.a].element,r=E[t.b].element;t.dragging&&c.onDragEnd&&c.onDragEnd(),t.dragging=!1,e[i]("mouseup",t.stop),e[i]("touchend",t.stop),e[i]("touchcancel",t.stop),t.parent[i]("mousemove",t.move),t.parent[i]("touchmove",t.move),delete t.stop,delete t.move,n[i]("selectstart",s),n[i]("dragstart",s),r[i]("selectstart",s),r[i]("dragstart",s),n.style.userSelect="",n.style.webkitUserSelect="",n.style.MozUserSelect="",n.style.pointerEvents="",r.style.userSelect="",r.style.webkitUserSelect="",r.style.MozUserSelect="",r.style.pointerEvents="",t.gutter.style.cursor="",t.parent.style.cursor=""}function S(t){var i=this,r=E[i.a].element,o=E[i.b].element;!i.dragging&&c.onDragStart&&c.onDragStart(),t.preventDefault(),i.dragging=!0,i.move=m.bind(i),i.stop=d.bind(i),e[n]("mouseup",i.stop),e[n]("touchend",i.stop),e[n]("touchcancel",i.stop),i.parent[n]("mousemove",i.move),i.parent[n]("touchmove",i.move),r[n]("selectstart",s),r[n]("dragstart",s),o[n]("selectstart",s),o[n]("dragstart",s),r.style.userSelect="none",r.style.webkitUserSelect="none",r.style.MozUserSelect="none",r.style.pointerEvents="none",o.style.userSelect="none",o.style.webkitUserSelect="none",o.style.MozUserSelect="none",o.style.pointerEvents="none",i.gutter.style.cursor=j,i.parent.style.cursor=j,g.call(i)}function v(e){e.forEach(function(t,n){if(n>0){var i=F[n-1],r=E[i.a],s=E[i.b];r.size=e[n-1],s.size=t,z(r.element,r.size,i.aGutterSize),z(s.element,s.size,i.bGutterSize)}})}function p(){F.forEach(function(e){e.parent.removeChild(e.gutter),E[e.a].element.style[y]="",E[e.b].element.style[y]=""})}void 0===c&&(c={});var y,b,G,E,w=l(u[0]).parentNode,D=e.getComputedStyle(w).flexDirection,U=c.sizes||u.map(function(){return 100/u.length}),k=void 0!==c.minSize?c.minSize:100,x=Array.isArray(k)?k:u.map(function(){return k}),L=void 0!==c.gutterSize?c.gutterSize:10,M=void 0!==c.snapOffset?c.snapOffset:30,O=c.direction||"horizontal",j=c.cursor||("horizontal"===O?"ew-resize":"ns-resize"),C=c.gutter||function(e,n){var i=t.createElement("div");return i.className="gutter gutter-"+n,i},A=c.elementStyle||function(e,t,n){var i={};return"string"==typeof t||t instanceof String?i[e]=t:i[e]=o?t+"%":a+"("+t+"% - "+n+"px)",i},B=c.gutterStyle||function(e,t){return n={},n[e]=t+"px",n;var n};"horizontal"===O?(y="width","clientWidth",b="clientX",G="left","paddingLeft"):"vertical"===O&&(y="height","clientHeight",b="clientY",G="top","paddingTop");var F=[];return E=u.map(function(e,t){var i,s={element:l(e),size:U[t],minSize:x[t]};if(t>0&&(i={a:t-1,b:t,dragging:!1,isFirst:1===t,isLast:t===u.length-1,direction:O,parent:w},i.aGutterSize=L,i.bGutterSize=L,i.isFirst&&(i.aGutterSize=L/2),i.isLast&&(i.bGutterSize=L/2),"row-reverse"===D||"column-reverse"===D)){var a=i.a;i.a=i.b,i.b=a}if(!o&&t>0){var c=C(t,O);h(c,L),c[n]("mousedown",S.bind(i)),c[n]("touchstart",S.bind(i)),w.insertBefore(c,s.element),i.gutter=c}0===t||t===u.length-1?z(s.element,s.size,L/2):z(s.element,s.size,L);var f=s.element[r]()[y];return f<s.minSize&&(s.minSize=f),t>0&&F.push(i),s}),o?{setSizes:v,destroy:p}:{setSizes:v,getSizes:function(){return E.map(function(e){return e.size})},collapse:function(e){if(e===F.length){var t=F[e-1];g.call(t),o||f.call(t,t.size-t.bGutterSize)}else{var n=F[e];g.call(n),o||f.call(n,n.aGutterSize)}},destroy:p}}});

///////////////////////////////////////////////

///////////////////////////////////////////////
// Copyright (c) 2013 Pieroxy <pieroxy@pieroxy.net>
// This work is free. You can redistribute it and/or modify it
// under the terms of the WTFPL, Version 2
// For more information see LICENSE.txt or http://www.wtfpl.net/
//
// For more information, the home page:
// http://pieroxy.net/blog/pages/lz-string/testing.html
//
// LZ-based compression algorithm, version 1.4.4
var LZString=function(){var o=String.fromCharCode,i={};var n={decompressFromBase64:function(o){return null==o?"":""==o?null:n._decompress(o.length,32,function(n){return function(o,n){if(!i[o]){i[o]={};for(var t=0;t<o.length;t++)i[o][o.charAt(t)]=t}return i[o][n]}("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",o.charAt(n))})},_decompress:function(i,n,t){var r,e,a,s,p,u,l,f=[],c=4,d=4,h=3,v="",g=[],m={val:t(0),position:n,index:1};for(r=0;r<3;r+=1)f[r]=r;for(a=0,p=Math.pow(2,2),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;switch(a){case 0:for(a=0,p=Math.pow(2,8),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;l=o(a);break;case 1:for(a=0,p=Math.pow(2,16),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;l=o(a);break;case 2:return""}for(f[3]=l,e=l,g.push(l);;){if(m.index>i)return"";for(a=0,p=Math.pow(2,h),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;switch(l=a){case 0:for(a=0,p=Math.pow(2,8),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;f[d++]=o(a),l=d-1,c--;break;case 1:for(a=0,p=Math.pow(2,16),u=1;u!=p;)s=m.val&m.position,m.position>>=1,0==m.position&&(m.position=n,m.val=t(m.index++)),a|=(s>0?1:0)*u,u<<=1;f[d++]=o(a),l=d-1,c--;break;case 2:return g.join("")}if(0==c&&(c=Math.pow(2,h),h++),f[l])v=f[l];else{if(l!==d)return null;v=e+e.charAt(0)}g.push(v),f[d++]=e+v.charAt(0),e=v,0==--c&&(c=Math.pow(2,h),h++)}}};return n}();"function"==typeof define&&define.amd?define(function(){return LZString}):"undefined"!=typeof module&&null!=module?module.exports=LZString:"undefined"!=typeof angular&&null!=angular&&angular.module("LZString",[]).factory("LZString",function(){return LZString});
///////////////////////////////////////////////

///////////////////////////////////////////////
/*!
 * PEP v0.4.3 | https://github.com/jquery/PEP
 * Copyright jQuery Foundation and other contributors | http://jquery.org/license
 */
!function(a,b){"object"==typeof exports&&"undefined"!=typeof module?module.exports=b():"function"==typeof define&&define.amd?define(b):a.PointerEventsPolyfill=b()}(this,function(){"use strict";function a(a,b){b=b||Object.create(null);var c=document.createEvent("Event");c.initEvent(a,b.bubbles||!1,b.cancelable||!1);
for(var d,e=2;e<m.length;e++)d=m[e],c[d]=b[d]||n[e];c.buttons=b.buttons||0;
var f=0;return f=b.pressure&&c.buttons?b.pressure:c.buttons?.5:0,c.x=c.clientX,c.y=c.clientY,c.pointerId=b.pointerId||0,c.width=b.width||0,c.height=b.height||0,c.pressure=f,c.tiltX=b.tiltX||0,c.tiltY=b.tiltY||0,c.twist=b.twist||0,c.tangentialPressure=b.tangentialPressure||0,c.pointerType=b.pointerType||"",c.hwTimestamp=b.hwTimestamp||0,c.isPrimary=b.isPrimary||!1,c}function b(){this.array=[],this.size=0}function c(a,b,c,d){this.addCallback=a.bind(d),this.removeCallback=b.bind(d),this.changedCallback=c.bind(d),A&&(this.observer=new A(this.mutationWatcher.bind(this)))}function d(a){return"body /shadow-deep/ "+e(a)}function e(a){return'[touch-action="'+a+'"]'}function f(a){return"{ -ms-touch-action: "+a+"; touch-action: "+a+"; }"}function g(){if(F){D.forEach(function(a){String(a)===a?(E+=e(a)+f(a)+"\n",G&&(E+=d(a)+f(a)+"\n")):(E+=a.selectors.map(e)+f(a.rule)+"\n",G&&(E+=a.selectors.map(d)+f(a.rule)+"\n"))});var a=document.createElement("style");a.textContent=E,document.head.appendChild(a)}}function h(){if(!window.PointerEvent){if(window.PointerEvent=a,window.navigator.msPointerEnabled){var b=window.navigator.msMaxTouchPoints;Object.defineProperty(window.navigator,"maxTouchPoints",{value:b,enumerable:!0}),u.registerSource("ms",_)}else Object.defineProperty(window.navigator,"maxTouchPoints",{value:0,enumerable:!0}),u.registerSource("mouse",N),void 0!==window.ontouchstart&&u.registerSource("touch",V);u.register(document)}}function i(a){if(!u.pointermap.has(a)){var b=new Error("InvalidPointerId");throw b.name="InvalidPointerId",b}}function j(a){for(var b=a.parentNode;b&&b!==a.ownerDocument;)b=b.parentNode;if(!b){var c=new Error("InvalidStateError");throw c.name="InvalidStateError",c}}function k(a){var b=u.pointermap.get(a);return 0!==b.buttons}function l(){window.Element&&!Element.prototype.setPointerCapture&&Object.defineProperties(Element.prototype,{setPointerCapture:{value:W},releasePointerCapture:{value:X},hasPointerCapture:{value:Y}})}
var m=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","pageX","pageY"],n=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0],o=window.Map&&window.Map.prototype.forEach,p=o?Map:b;b.prototype={set:function(a,b){return void 0===b?this["delete"](a):(this.has(a)||this.size++,void(this.array[a]=b))},has:function(a){return void 0!==this.array[a]},"delete":function(a){this.has(a)&&(delete this.array[a],this.size--)},get:function(a){return this.array[a]},clear:function(){this.array.length=0,this.size=0},forEach:function(a,b){return this.array.forEach(function(c,d){a.call(b,c,d,this)},this)}};var q=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","buttons","pointerId","width","height","pressure","tiltX","tiltY","pointerType","hwTimestamp","isPrimary","type","target","currentTarget","which","pageX","pageY","timeStamp"],r=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0,0,0,0,0,0,"",0,!1,"",null,null,0,0,0,0],s={pointerover:1,pointerout:1,pointerenter:1,pointerleave:1},t="undefined"!=typeof SVGElementInstance,u={pointermap:new p,eventMap:Object.create(null),captureInfo:Object.create(null),eventSources:Object.create(null),eventSourceList:[],registerSource:function(a,b){var c=b,d=c.events;d&&(d.forEach(function(a){c[a]&&(this.eventMap[a]=c[a].bind(c))},this),this.eventSources[a]=c,this.eventSourceList.push(c))},register:function(a){for(var b,c=this.eventSourceList.length,d=0;d<c&&(b=this.eventSourceList[d]);d++)
b.register.call(b,a)},unregister:function(a){for(var b,c=this.eventSourceList.length,d=0;d<c&&(b=this.eventSourceList[d]);d++)
b.unregister.call(b,a)},contains:function(a,b){try{return a.contains(b)}catch(c){return!1}},down:function(a){a.bubbles=!0,this.fireEvent("pointerdown",a)},move:function(a){a.bubbles=!0,this.fireEvent("pointermove",a)},up:function(a){a.bubbles=!0,this.fireEvent("pointerup",a)},enter:function(a){a.bubbles=!1,this.fireEvent("pointerenter",a)},leave:function(a){a.bubbles=!1,this.fireEvent("pointerleave",a)},over:function(a){a.bubbles=!0,this.fireEvent("pointerover",a)},out:function(a){a.bubbles=!0,this.fireEvent("pointerout",a)},cancel:function(a){a.bubbles=!0,this.fireEvent("pointercancel",a)},leaveOut:function(a){this.out(a),this.propagate(a,this.leave,!1)},enterOver:function(a){this.over(a),this.propagate(a,this.enter,!0)},eventHandler:function(a){if(!a._handledByPE){var b=a.type,c=this.eventMap&&this.eventMap[b];c&&c(a),a._handledByPE=!0}},listen:function(a,b){b.forEach(function(b){this.addEvent(a,b)},this)},unlisten:function(a,b){b.forEach(function(b){this.removeEvent(a,b)},this)},addEvent:function(a,b){a.addEventListener(b,this.boundHandler)},removeEvent:function(a,b){a.removeEventListener(b,this.boundHandler)},makeEvent:function(b,c){this.captureInfo[c.pointerId]&&(c.relatedTarget=null);var d=new a(b,c);return c.preventDefault&&(d.preventDefault=c.preventDefault),d._target=d._target||c.target,d},fireEvent:function(a,b){var c=this.makeEvent(a,b);return this.dispatchEvent(c)},cloneEvent:function(a){for(var b,c=Object.create(null),d=0;d<q.length;d++)b=q[d],c[b]=a[b]||r[d],!t||"target"!==b&&"relatedTarget"!==b||c[b]instanceof SVGElementInstance&&(c[b]=c[b].correspondingUseElement);return a.preventDefault&&(c.preventDefault=function(){a.preventDefault()}),c},getTarget:function(a){var b=this.captureInfo[a.pointerId];return b?a._target!==b&&a.type in s?void 0:b:a._target},propagate:function(a,b,c){for(var d=a.target,e=[];d!==document&&!d.contains(a.relatedTarget);) if(e.push(d),d=d.parentNode,!d)return;c&&e.reverse(),e.forEach(function(c){a.target=c,b.call(this,a)},this)},setCapture:function(b,c,d){this.captureInfo[b]&&this.releaseCapture(b,d),this.captureInfo[b]=c,this.implicitRelease=this.releaseCapture.bind(this,b,d),document.addEventListener("pointerup",this.implicitRelease),document.addEventListener("pointercancel",this.implicitRelease);var e=new a("gotpointercapture");e.pointerId=b,e._target=c,d||this.asyncDispatchEvent(e)},releaseCapture:function(b,c){var d=this.captureInfo[b];if(d){this.captureInfo[b]=void 0,document.removeEventListener("pointerup",this.implicitRelease),document.removeEventListener("pointercancel",this.implicitRelease);var e=new a("lostpointercapture");e.pointerId=b,e._target=d,c||this.asyncDispatchEvent(e)}},dispatchEvent:/*scope.external.dispatchEvent || */function(a){var b=this.getTarget(a);if(b)return b.dispatchEvent(a)},asyncDispatchEvent:function(a){requestAnimationFrame(this.dispatchEvent.bind(this,a))}};u.boundHandler=u.eventHandler.bind(u);var v={shadow:function(a){if(a)return a.shadowRoot||a.webkitShadowRoot},canTarget:function(a){return a&&Boolean(a.elementFromPoint)},targetingShadow:function(a){var b=this.shadow(a);if(this.canTarget(b))return b},olderShadow:function(a){var b=a.olderShadowRoot;if(!b){var c=a.querySelector("shadow");c&&(b=c.olderShadowRoot)}return b},allShadows:function(a){for(var b=[],c=this.shadow(a);c;)b.push(c),c=this.olderShadow(c);return b},searchRoot:function(a,b,c){if(a){var d,e,f=a.elementFromPoint(b,c);for(e=this.targetingShadow(f);e;){if(d=e.elementFromPoint(b,c)){var g=this.targetingShadow(d);return this.searchRoot(g,b,c)||d} e=this.olderShadow(e)} return f}},owner:function(a){
for(var b=a;b.parentNode;)b=b.parentNode;
return b.nodeType!==Node.DOCUMENT_NODE&&b.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&(b=document),b},findTarget:function(a){var b=a.clientX,c=a.clientY,d=this.owner(a.target);
return d.elementFromPoint(b,c)||(d=document),this.searchRoot(d,b,c)}},w=Array.prototype.forEach.call.bind(Array.prototype.forEach),x=Array.prototype.map.call.bind(Array.prototype.map),y=Array.prototype.slice.call.bind(Array.prototype.slice),z=Array.prototype.filter.call.bind(Array.prototype.filter),A=window.MutationObserver||window.WebKitMutationObserver,B="[touch-action]",C={subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0,attributeFilter:["touch-action"]};c.prototype={watchSubtree:function(a){
//
this.observer&&v.canTarget(a)&&this.observer.observe(a,C)},enableOnSubtree:function(a){this.watchSubtree(a),a===document&&"complete"!==document.readyState?this.installOnLoad():this.installNewSubtree(a)},installNewSubtree:function(a){w(this.findElements(a),this.addElement,this)},findElements:function(a){return a.querySelectorAll?a.querySelectorAll(B):[]},removeElement:function(a){this.removeCallback(a)},addElement:function(a){this.addCallback(a)},elementChanged:function(a,b){this.changedCallback(a,b)},concatLists:function(a,b){return a.concat(y(b))},
installOnLoad:function(){document.addEventListener("readystatechange",function(){"complete"===document.readyState&&this.installNewSubtree(document)}.bind(this))},isElement:function(a){return a.nodeType===Node.ELEMENT_NODE},flattenMutationTree:function(a){
var b=x(a,this.findElements,this);
return b.push(z(a,this.isElement)),b.reduce(this.concatLists,[])},mutationWatcher:function(a){a.forEach(this.mutationHandler,this)},mutationHandler:function(a){if("childList"===a.type){var b=this.flattenMutationTree(a.addedNodes);b.forEach(this.addElement,this);var c=this.flattenMutationTree(a.removedNodes);c.forEach(this.removeElement,this)}else"attributes"===a.type&&this.elementChanged(a.target,a.oldValue)}};var D=["none","auto","pan-x","pan-y",{rule:"pan-x pan-y",selectors:["pan-x pan-y","pan-y pan-x"]}],E="",F=window.PointerEvent||window.MSPointerEvent,G=!window.ShadowDOMPolyfill&&document.head.createShadowRoot,H=u.pointermap,I=25,J=[1,4,2,8,16],K=!1;try{K=1===new MouseEvent("test",{buttons:1}).buttons}catch(L){}
var M,N={POINTER_ID:1,POINTER_TYPE:"mouse",events:["mousedown","mousemove","mouseup","mouseover","mouseout"],register:function(a){u.listen(a,this.events)},unregister:function(a){u.unlisten(a,this.events)},lastTouches:[],
isEventSimulatedFromTouch:function(a){for(var b,c=this.lastTouches,d=a.clientX,e=a.clientY,f=0,g=c.length;f<g&&(b=c[f]);f++){
var h=Math.abs(d-b.x),i=Math.abs(e-b.y);if(h<=I&&i<=I)return!0}},prepareEvent:function(a){var b=u.cloneEvent(a),c=b.preventDefault;return b.preventDefault=function(){a.preventDefault(),c()},b.pointerId=this.POINTER_ID,b.isPrimary=!0,b.pointerType=this.POINTER_TYPE,b},prepareButtonsForMove:function(a,b){var c=H.get(this.POINTER_ID);
0!==b.which&&c?a.buttons=c.buttons:a.buttons=0,b.buttons=a.buttons},mousedown:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=H.get(this.POINTER_ID),c=this.prepareEvent(a);K||(c.buttons=J[c.button],b&&(c.buttons|=b.buttons),a.buttons=c.buttons),H.set(this.POINTER_ID,a),b&&0!==b.buttons?u.move(c):u.down(c)}},mousemove:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,H.set(this.POINTER_ID,a),u.move(b)}},mouseup:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=H.get(this.POINTER_ID),c=this.prepareEvent(a);if(!K){var d=J[c.button];
c.buttons=b?b.buttons&~d:0,a.buttons=c.buttons}H.set(this.POINTER_ID,a),
c.buttons&=~J[c.button],0===c.buttons?u.up(c):u.move(c)}},mouseover:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,H.set(this.POINTER_ID,a),u.enterOver(b)}},mouseout:function(a){if(!this.isEventSimulatedFromTouch(a)){var b=this.prepareEvent(a);K||this.prepareButtonsForMove(b,a),b.button=-1,u.leaveOut(b)}},cancel:function(a){var b=this.prepareEvent(a);u.cancel(b),this.deactivateMouse()},deactivateMouse:function(){H["delete"](this.POINTER_ID)}},O=u.captureInfo,P=v.findTarget.bind(v),Q=v.allShadows.bind(v),R=u.pointermap,S=2500,T=200,U="touch-action",V={events:["touchstart","touchmove","touchend","touchcancel"],register:function(a){M.enableOnSubtree(a)},unregister:function(){},elementAdded:function(a){var b=a.getAttribute(U),c=this.touchActionToScrollType(b);c&&(a._scrollType=c,u.listen(a,this.events),
Q(a).forEach(function(a){a._scrollType=c,u.listen(a,this.events)},this))},elementRemoved:function(a){a._scrollType=void 0,u.unlisten(a,this.events),
Q(a).forEach(function(a){a._scrollType=void 0,u.unlisten(a,this.events)},this)},elementChanged:function(a,b){var c=a.getAttribute(U),d=this.touchActionToScrollType(c),e=this.touchActionToScrollType(b);
d&&e?(a._scrollType=d,Q(a).forEach(function(a){a._scrollType=d},this)):e?this.elementRemoved(a):d&&this.elementAdded(a)},scrollTypes:{EMITTER:"none",XSCROLLER:"pan-x",YSCROLLER:"pan-y",SCROLLER:/^(?:pan-x pan-y)|(?:pan-y pan-x)|auto$/},touchActionToScrollType:function(a){var b=a,c=this.scrollTypes;return"none"===b?"none":b===c.XSCROLLER?"X":b===c.YSCROLLER?"Y":c.SCROLLER.exec(b)?"XY":void 0},POINTER_TYPE:"touch",firstTouch:null,isPrimaryTouch:function(a){return this.firstTouch===a.identifier},setPrimaryTouch:function(a){
(0===R.size||1===R.size&&R.has(1))&&(this.firstTouch=a.identifier,this.firstXY={X:a.clientX,Y:a.clientY},this.scrolling=!1,this.cancelResetClickCount())},removePrimaryPointer:function(a){a.isPrimary&&(this.firstTouch=null,this.firstXY=null,this.resetClickCount())},clickCount:0,resetId:null,resetClickCount:function(){var a=function(){this.clickCount=0,this.resetId=null}.bind(this);this.resetId=setTimeout(a,T)},cancelResetClickCount:function(){this.resetId&&clearTimeout(this.resetId)},typeToButtons:function(a){var b=0;return"touchstart"!==a&&"touchmove"!==a||(b=1),b},touchToPointer:function(a){var b=this.currentTouchEvent,c=u.cloneEvent(a),d=c.pointerId=a.identifier+2;c.target=O[d]||P(c),c.bubbles=!0,c.cancelable=!0,c.detail=this.clickCount,c.button=0,c.buttons=this.typeToButtons(b.type),c.width=2*(a.radiusX||a.webkitRadiusX||0),c.height=2*(a.radiusY||a.webkitRadiusY||0),c.pressure=a.force||a.webkitForce||.5,c.isPrimary=this.isPrimaryTouch(a),c.pointerType=this.POINTER_TYPE,
c.altKey=b.altKey,c.ctrlKey=b.ctrlKey,c.metaKey=b.metaKey,c.shiftKey=b.shiftKey;
var e=this;return c.preventDefault=function(){e.scrolling=!1,e.firstXY=null,b.preventDefault()},c},processTouches:function(a,b){var c=a.changedTouches;this.currentTouchEvent=a;for(var d,e=0;e<c.length;e++)d=c[e],b.call(this,this.touchToPointer(d))},
shouldScroll:function(a){if(this.firstXY){var b,c=a.currentTarget._scrollType;if("none"===c)
b=!1;else if("XY"===c)
b=!0;else{var d=a.changedTouches[0],e=c,f="Y"===c?"X":"Y",g=Math.abs(d["client"+e]-this.firstXY[e]),h=Math.abs(d["client"+f]-this.firstXY[f]);
b=g>=h}return this.firstXY=null,b}},findTouch:function(a,b){for(var c,d=0,e=a.length;d<e&&(c=a[d]);d++)if(c.identifier===b)return!0},
vacuumTouches:function(a){var b=a.touches;
if(R.size>=b.length){var c=[];R.forEach(function(a,d){
if(1!==d&&!this.findTouch(b,d-2)){var e=a.out;c.push(e)}},this),c.forEach(this.cancelOut,this)}},touchstart:function(a){this.vacuumTouches(a),this.setPrimaryTouch(a.changedTouches[0]),this.dedupSynthMouse(a),this.scrolling||(this.clickCount++,this.processTouches(a,this.overDown))},overDown:function(a){R.set(a.pointerId,{target:a.target,out:a,outTarget:a.target}),u.enterOver(a),u.down(a)},touchmove:function(a){this.scrolling||(this.shouldScroll(a)?(this.scrolling=!0,this.touchcancel(a)):(a.preventDefault(),this.processTouches(a,this.moveOverOut)))},moveOverOut:function(a){var b=a,c=R.get(b.pointerId);
if(c){var d=c.out,e=c.outTarget;u.move(b),d&&e!==b.target&&(d.relatedTarget=b.target,b.relatedTarget=e,
d.target=e,b.target?(u.leaveOut(d),u.enterOver(b)):(
b.target=e,b.relatedTarget=null,this.cancelOut(b))),c.out=b,c.outTarget=b.target}},touchend:function(a){this.dedupSynthMouse(a),this.processTouches(a,this.upOut)},upOut:function(a){this.scrolling||(u.up(a),u.leaveOut(a)),this.cleanUpPointer(a)},touchcancel:function(a){this.processTouches(a,this.cancelOut)},cancelOut:function(a){u.cancel(a),u.leaveOut(a),this.cleanUpPointer(a)},cleanUpPointer:function(a){R["delete"](a.pointerId),this.removePrimaryPointer(a)},
dedupSynthMouse:function(a){var b=N.lastTouches,c=a.changedTouches[0];
if(this.isPrimaryTouch(c)){
var d={x:c.clientX,y:c.clientY};b.push(d);var e=function(a,b){var c=a.indexOf(b);c>-1&&a.splice(c,1)}.bind(null,b,d);setTimeout(e,S)}}};M=new c(V.elementAdded,V.elementRemoved,V.elementChanged,V);var W,X,Y,Z=u.pointermap,$=window.MSPointerEvent&&"number"==typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE,_={events:["MSPointerDown","MSPointerMove","MSPointerUp","MSPointerOut","MSPointerOver","MSPointerCancel","MSGotPointerCapture","MSLostPointerCapture"],register:function(a){u.listen(a,this.events)},unregister:function(a){u.unlisten(a,this.events)},POINTER_TYPES:["","unavailable","touch","pen","mouse"],prepareEvent:function(a){var b=a;return $&&(b=u.cloneEvent(a),b.pointerType=this.POINTER_TYPES[a.pointerType]),b},cleanup:function(a){Z["delete"](a)},MSPointerDown:function(a){Z.set(a.pointerId,a);var b=this.prepareEvent(a);u.down(b)},MSPointerMove:function(a){var b=this.prepareEvent(a);u.move(b)},MSPointerUp:function(a){var b=this.prepareEvent(a);u.up(b),this.cleanup(a.pointerId)},MSPointerOut:function(a){var b=this.prepareEvent(a);u.leaveOut(b)},MSPointerOver:function(a){var b=this.prepareEvent(a);u.enterOver(b)},MSPointerCancel:function(a){var b=this.prepareEvent(a);u.cancel(b),this.cleanup(a.pointerId)},MSLostPointerCapture:function(a){var b=u.makeEvent("lostpointercapture",a);u.dispatchEvent(b)},MSGotPointerCapture:function(a){var b=u.makeEvent("gotpointercapture",a);u.dispatchEvent(b)}},aa=window.navigator;aa.msPointerEnabled?(W=function(a){i(a),j(this),k(a)&&(u.setCapture(a,this,!0),this.msSetPointerCapture(a))},X=function(a){i(a),u.releaseCapture(a,!0),this.msReleasePointerCapture(a)}):(W=function(a){i(a),j(this),k(a)&&u.setCapture(a,this)},X=function(a){i(a),u.releaseCapture(a)}),Y=function(a){return!!u.captureInfo[a]},g(),h(),l();var ba={dispatcher:u,Installer:c,PointerEvent:a,PointerMap:p,targetFinding:v};return ba});

///////////////////////////////////////////////

///////////////////////////////////////////////
var config = {"show_fabrication": false, "redraw_on_drag": true, "highlight_pin1": false, "extra_fields": [], "dark_mode": false, "bom_view": "left-right", "board_rotation": 0, "checkboxes": "Sourced,Placed", "show_silkscreen": true, "show_pads": true, "layer_view": "FB"}
///////////////////////////////////////////////

///////////////////////////////////////////////
var pcbdata = JSON.parse(LZString.decompressFromBase64("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BL0i3weAhoR5phA7BecGOwdDIPcEZwYqsgcEQIT6Ubph/wcbBscFXALcA8CHzwftgcUCnwQWiMCGEIX3Ya9bPwaHBc/DTwfPBuwiAIR30aCHhwe/wayL9MIwhjCFGtGvBtsGI7MvB0CF5rq3BLcFF+h/BSCH/HEwhgiEBNKQh4CGFwTwheXqHIuIhhCGdGOvBTcGK1kIhgiGvEkQhHcEf1MghdCEdWNgh/cGAivPB/cELtiIh/8Fn8NAhRiHAdEghpiE/wcisQNqWIVYhU8GsIbsOUCGdwS3BSiHGIW3BfcEgIVHB3LQ6IXIhiCGAIWIhHCFcrGohk8HwnAohTCFhNJ4hjcFeYtwh7sHtwZEhwlIsIWEhvcHTBFYhSSG/tCHghiEOIRIhJCF8ITFIGCFlwRSAmiG2wftgk4D4IfXBjLzOIR7BmSG0IYEiWSFEeBUhaiHk7MohRcEXWMEhjCGV8DEhDsECIc0hy6IZ7J0hEbjVIa3y7CENIb7SWJxSIQ7BDCK0IW/O1Cx9IXfB+iHGwTIhbiGDwQMhZSHztKUh6SErwd0hnSE2IfEhq+KrIe0hT8FTIQE0gyGwIXsh4yF3wSchvOKbIbIhdiFjLH4hRcFOITshHdxxwXkhFCH9wftg74DFIZbB98EzIXP4zyFsIa4h+SEF4hPwySFJIbUhZiFAIe9kNyFONKChPsEd9D0hVQSpIaAIIyG5wXEhlyEJIXtsUyEnyvchJNaoIQEhPrZfId0YCKEQocsh6KFIBIihtyHHITihwiHoocO4eKE7wY8hjni2ITuw+2BiQO8h58FM6IShk8rUIaEhKKGDwSChI8HdYjih5yHDIYShXKHzIQvB9LZQoYGKFiFAoZYhHSGdIa0hpKHZwbChXSF+Zj0h4qE3wUX6CqHLIZihryzYoRKhMWQ0oZShZyFzIf8hiyGrIXchbSFa1kqhFyGiofKhhKHUofshgKHSoUDa9qEnIQchWyFioRohPyFXIQ6sAqGPwf1khyEfBKXBe8H0oe6h+2AbgCyhdtAqoRshVLbsoQwhqqHkoRKhr8GRoeyhxCFl4l6h0TRnIX6hwCH5IeRUgog5oaQI7qHSGjkhwaH7dqGhwgDQQBGhDqwpoSPinKFLbPmhvKFhwXF03KGAmJe4gCE1ikGhWCHpoXhA+2BSQJWh6yHNIQ2h0KG/wRShg6FkIfvwoqHSGvQhUqFOof46LuLuoSKh/yFwIemh3iFfIWqhIiEkob6hKCEMoQshfyE/IYvBAaE7+gehTCLptvOhqGwTobUMm8EGobahhyEuoRShcaHRoQEYXaHlBBahZFjmoYihYyECocahe6EfoXqhf+wOoQShAaHnNJqh96EDoYo6eqHjIi+hiqFKoeOhOaGBuNBh9iEvoWuhH8FxDIWho/raofyheqFZoQwyrqHFoZ2h26HjgPtgqEB9of3mpKG3oYmhw6GJoWRhB8Hx7JBhpPT5oavixKFvoX4hpqExIYrISyHCUj+hN8F/oThh/vRGoS8Y2qEsYVIhyKE2oc30VqEmuNehSyGjobziTaHnoSVEfmi1ofr47GHVVn5oC6F7ocJh2CErodUhXCEKoZphtCFIYVfBKGHNoRvB3QjuoaoSSmHHoW2hd8GoYXJhXqL3IcP06GG+IcohlqGwodxhd6EAYexhtUymYZxhIiH6YeAhObJ0oaWhzaH7YIhAxGHWYWAqAqGH+pihsqHNIaphrCHd+JqhrKyboViqsmG94klh2mEQobFhniEWtE+h0SGkYeJhZ6GwYVJhWTgSYekhRWHZIaJhLmH5YU/UCWHqYRQh3mEfwelhgyH1YVfBS6EMoYJhy8FE+gGhIGHBIdFhwSElYZEhvmFIIUgEYWGDYX7BuWE3IUBhwqG7oXFhnmHNoVjWaWEgHEehqWGYYVuhqGERdGthTGHKIeNhDSHWoRphBWFeoa2hV6GF8LRhVGGkIZYMYmGPofhh7WHSIacSR6HNYaIhHbhrYfdh/CGLYeZhkiHsobNhoqHqCEqh+Jy0Yf1h4iGjYeHBuGFPIfhh+2AIAHXBHyH4YcZhKyEWodthziG7YXVh02FZYadhL8G6YWohCOFzwZlhsiH7oeZhWOFyISjhl8FJoavBG2FBIbChcOGdwYDh/SFI4djhk2GHIWjhoKGU4ZKh+vgk4WxWZOHU4fjhQqF04R2h+8EGoftgRhAQ4ayhUOHZwbRh9dQMgJo0b2F44VnBqxLVocDh7PhGYdXBs8AC4ZGhmaEoITOhQNrdYQohAxhq4XvwXsFiTvhhBOGfwWkhFqE1oV8hVSF8YZehDqHc4aDMkGH7YFuASuEzbClhm2HGIc9hsyGeoVdh5GwRYQbhBiGF8PhheiH/odMERmEXoXrhp6GKYVFh6shJYZL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Zs9nQOTnZsulUGSE5mmmN0OE5V9mROQcZ5Dk72W3ZOjlKmQI5XtllORk5U+k2aWo5UTkaOeFZCtn9Ke3Zujmd2RdZeZlfGbHZr2mmOa055AFH6dk54Q48mTY5eCmfWQKZZtlX6UzZTjnKEKzZ1gEfkH7piMAb2Y3Z05nYmdI5ipnYOYOZH5nOOWqZ6QEfkG/oE2Q7Od45ezmPGTE5mDlxOdApjFAGOUbpyikWmT5pYzn8ABQpGznXnixqY9mHmXM5cmkLObw5kDlZ2cU589ksCes55zm0aZU5HTl3GSXZvjll2dQ5l6nNOfI5ZzmKMBDp93hVORiZU5lYmXc5lDm72dUZ2ZlLiTIZjJm92RrZnznWgN850Lk26ZY5Btm16eFp+Tl2OU3pjNmW2SqZ1tnj6dcB+6kAaHC5XZm1OVI5VDlZmUc5qLme6UzUXLnx6eQGyHGO2aGZ29nuqUdZhLnl2cS5EdlR2cM5RjmWmSY5XzmcueCCUwFV6dM5yRmzOXk5HfAFOTPZFtlz2as5kLlfmdq5MLmKWneZqjnwuWQ5ArkKuci5oUmBObA5YrlWuUZeWLm8uf+ZXTlB2S3ZARlOuUK5NDnQKRdJiTlvOdBZ65kD2XvpWrn2AspedLmcORPZxtm1mdPZrLlmuey5pzkjmciBmylbOd65Ttn8ud05IFlBuSi5cjmiudAeHlA2PBKQlzlY6eI5nTn5uX65mjkBuQ05RLlgWS/ZHxkrmUk5fdkauVS54+nluSiBlel/OcpZ49lHmbY5wLkpuQ45KznpuWs5Hem9uZsp3em5uTK5t9l+Of05TTkluVXZZblZuZPpXrm2uRE5tbk+OZ/pTxlaOX05jTktuUuJDJntueG5yTlduZppXukzuVhBtun0uafpEJlT2QzZ47lsuUOZGqnGGXvuy3yK3saB1zk1OXu5l2mxOSPpODnWqVeZqfIRmEaBIwG7Wedpi7nB2b05odnNucG5OenagYMZtVnkuaM5zDlYgJ+5ulhwMj+5UHkJucO58znp2S+5DZnYWU2ZqOkRCYfQRYF58PO5uLlhmfU52jmIecW5ldluWYHUYuhMxo/uBmijmH+5u7m3OUBZBLlNuYq5J7ncqUM5ZLkduRS5mHnq7rnx2pRuCVx586mgmYbZhrm/Scy5Hpnm2cNZIOmuWbxZGlj4kJAKMP4L+C7xDFnkWbD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"))
///////////////////////////////////////////////

///////////////////////////////////////////////
/* Utility functions */

var storagePrefix = 'KiCad_HTML_BOM__' + pcbdata.metadata.title + '__' +
  pcbdata.metadata.revision + '__#';
var storage;

function initStorage(key) {
  try {
    window.localStorage.getItem("blank");
    storage = window.localStorage;
  } catch (e) {
    // localStorage not available
  }
  if (!storage) {
    try {
      window.sessionStorage.getItem("blank");
      storage = window.sessionStorage;
    } catch (e) {
      // sessionStorage also not available
    }
  }
}

function readStorage(key) {
  if (storage) {
    return storage.getItem(storagePrefix + key);
  } else {
    return null;
  }
}

function writeStorage(key, value) {
  if (storage) {
    storage.setItem(storagePrefix + key, value);
  }
}

function fancyDblClickHandler(el, onsingle, ondouble) {
  return function() {
    if (el.getAttribute("data-dblclick") == null) {
      el.setAttribute("data-dblclick", 1);
      setTimeout(function() {
        if (el.getAttribute("data-dblclick") == 1) {
          onsingle();
        }
        el.removeAttribute("data-dblclick");
      }, 200);
    } else {
      el.removeAttribute("data-dblclick");
      ondouble();
    }
  }
}

function smoothScrollToRow(rowid) {
  document.getElementById(rowid).scrollIntoView({
    behavior: "smooth",
    block: "center",
    inline: "nearest"
  });
}

function focusInputField(input) {
  input.scrollIntoView(false);
  input.focus();
  input.select();
}

function copyToClipboard() {
  var text = '';
  for (var node of bomhead.childNodes[0].childNodes) {
    if (node.firstChild) {
      text = text + node.firstChild.nodeValue;
    }
    if (node != bomhead.childNodes[0].lastChild) {
      text += '\t';
    }
  }
  text += '\n';
  for (var row of bombody.childNodes) {
    for (var cell of row.childNodes) {
      for (var node of cell.childNodes) {
        if (node.nodeName == "INPUT") {
          if (node.checked) {
            text = text + '✓';
          }
        } else if (node.nodeName == "MARK") {
          text = text + node.firstChild.nodeValue;
        } else {
          text = text + node.nodeValue;
        }
      }
      if (cell != row.lastChild) {
        text += '\t';
      }
    }
    text += '\n';
  }
  var textArea = document.createElement("textarea");
  textArea.classList.add('clipboard-temp');
  textArea.value = text;

  document.body.appendChild(textArea);
  textArea.focus();
  textArea.select();

  try {
    if (document.execCommand('copy')) {
      console.log('Bom copied to clipboard.');
    }
  } catch (err) {
    console.log('Can not copy to clipboard.');
  }

  document.body.removeChild(textArea);
}

function removeGutterNode(node) {
  for (var i = 0; i < node.childNodes.length; i++) {
    if (node.childNodes[i].classList &&
      node.childNodes[i].classList.contains("gutter")) {
      node.removeChild(node.childNodes[i]);
      break;
    }
  }
}

function cleanGutters() {
  removeGutterNode(document.getElementById("bot"));
  removeGutterNode(document.getElementById("canvasdiv"));
}

var units = {
  prefixes: {
    giga: ["G", "g", "giga", "Giga", "GIGA"],
    mega: ["M", "mega", "Mega", "MEGA"],
    kilo: ["K", "k", "kilo", "Kilo", "KILO"],
    milli: ["m", "milli", "Milli", "MILLI"],
    micro: ["U", "u", "micro", "Micro", "MICRO", "μ", "µ"], // different utf8 μ
    nano: ["N", "n", "nano", "Nano", "NANO"],
    pico: ["P", "p", "pico", "Pico", "PICO"],
  },
  unitsShort: ["R", "r", "Ω", "F", "f", "H", "h"],
  unitsLong: [
    "OHM", "Ohm", "ohm", "ohms",
    "FARAD", "Farad", "farad",
    "HENRY", "Henry", "henry"
  ],
  getMultiplier: function(s) {
    if (this.prefixes.giga.includes(s)) return 1e9;
    if (this.prefixes.mega.includes(s)) return 1e6;
    if (this.prefixes.kilo.includes(s)) return 1e3;
    if (this.prefixes.milli.includes(s)) return 1e-3;
    if (this.prefixes.micro.includes(s)) return 1e-6;
    if (this.prefixes.nano.includes(s)) return 1e-9;
    if (this.prefixes.pico.includes(s)) return 1e-12;
    return 1;
  },
  valueRegex: null,
}

function initUtils() {
  var allPrefixes = units.prefixes.giga
                    .concat(units.prefixes.mega)
                    .concat(units.prefixes.kilo)
                    .concat(units.prefixes.milli)
                    .concat(units.prefixes.micro)
                    .concat(units.prefixes.nano)
                    .concat(units.prefixes.pico);
  var allUnits = units.unitsShort.concat(units.unitsLong);
  units.valueRegex = new RegExp("^([0-9\.]+)" +
                         "\\s*(" + allPrefixes.join("|") + ")?" +
                         "(" + allUnits.join("|") + ")?" +
                         "(\\b.*)?$", "");
  units.valueAltRegex = new RegExp("^([0-9]*)" +
                         "(" + units.unitsShort.join("|") + ")?" +
                         "([GgMmKkUuNnPp])?" +
                         "([0-9]*)" +
                         "(\\b.*)?$", "");
  for (var bom_type of ["both", "F", "B"]) {
    for (var row of pcbdata.bom[bom_type]) {
      row.push(parseValue(row[1], row[3][0][0]));
    }
  }
}

function parseValue(val, ref) {
  var inferUnit = (unit, ref) => {
    if (unit) {
      unit = unit.toLowerCase();
      if (unit == 'Ω' || unit == "ohm" || unit == "ohms") {
        unit = 'r';
      }
      unit = unit[0];
    } else {
      ref = /^([a-z]+)\d+$/i.exec(ref);
      if (ref) {
        ref = ref[1].toLowerCase();
        if (ref == "c") unit = 'f';
        else if (ref == "l") unit = 'h';
        else if (ref == "r" || ref == "rv") unit = 'r';
        else unit = null;
      }
    }
    return unit;
  };
  val = val.replace(/,/g, "");
  var match = units.valueRegex.exec(val);
  var unit;
  if (match) {
    val = parseFloat(match[1]);
    if (match[2]) {
      val = val * units.getMultiplier(match[2]);
    }
    unit = inferUnit(match[3], ref);
    if (!unit) return null;
    else return {
      val: val,
      unit: unit,
      extra: match[4],
    }
  }
  match = units.valueAltRegex.exec(val);
  if (match && (match[1] || match[4])) {
    val = parseFloat(match[1] + "." + match[4]);
    if (match[3]) {
      val = val * units.getMultiplier(match[3]);
    }
    unit = inferUnit(match[2], ref);
    if (!unit) return null;
    else return {
      val: val,
      unit: unit,
      extra: match[5],
    }
  }
  return null;
}

function valueCompare(a, b, stra, strb) {
  if (a === null && b === null) {
    // Failed to parse both values, compare them as strings.
    if (stra != strb) return stra > strb ? 1 : -1;
    else return 0;
  } else if (a === null) {
    return 1;
  } else if (b === null) {
    return -1;
  } else {
    if (a.unit != b.unit) return a.unit > b.unit ? 1 : -1;
    else if (a.val != b.val) return a.val > b.val ? 1 : -1;
    else if (a.extra != b.extra) return a.extra > b.extra ? 1 : -1;
    else return 0;
  }
}

function validateSaveImgDimension(element) {
  var valid = false;
  var intValue = 0;
  if (/^[1-9]\d*$/.test(element.value)) {
    intValue = parseInt(element.value);
    if (intValue <= 16000) {
      valid = true;
    }
  }
  if (valid) {
    element.classList.remove("invalid");
  } else {
    element.classList.add("invalid");
  }
  return intValue;
}

function saveImage(layer) {
  var width = validateSaveImgDimension(document.getElementById("render-save-width"));
  var height = validateSaveImgDimension(document.getElementById("render-save-height"));
  var bgcolor = null;
  if (!document.getElementById("render-save-transparent").checked) {
    var style = getComputedStyle(topmostdiv);
    bgcolor = style.getPropertyValue("background-color");
  }
  if (!width || !height) return;

  // Prepare image
  var canvas = document.createElement("canvas");
  var layerdict = {
    transform: {
      x: 0,
      y: 0,
      s: 1,
      panx: 0,
      pany: 0,
      zoom: 1,
    },
    bg: canvas,
    fab: canvas,
    silk: canvas,
    highlight: canvas,
    layer: layer,
  }
  // Do the rendering
  recalcLayerScale(layerdict, width, height);
  prepareLayer(layerdict);
  clearCanvas(canvas, bgcolor);
  drawBackground(layerdict, false);
  drawHighlightsOnLayer(layerdict, false);

  // Save image
  var imgdata = canvas.toDataURL("image/png");

  var filename = pcbdata.metadata.title;
  if (pcbdata.metadata.revision) {
    filename += `.${pcbdata.metadata.revision}`;
  }
  filename += `.${layer}.png`;
  saveFile(filename, dataURLtoBlob(imgdata));
}

function saveSettings() {
  var data = {
    type: "InteractiveHtmlBom settings",
    version: 1,
    pcbmetadata: pcbdata.metadata,
    settings: settings,
  }
  var blob = new Blob([JSON.stringify(data, null, 4)], {type: "application/json"});
  saveFile(`${pcbdata.metadata.title}.settings.json`, blob);
}

function loadSettings() {
  var input = document.createElement("input");
  input.type = "file";
  input.accept = ".settings.json";
  input.onchange = function(e) {
    var file = e.target.files[0];
    var reader = new FileReader();
    reader.onload = readerEvent => {
      var content = readerEvent.target.result;
      var newSettings;
      try {
        newSettings = JSON.parse(content);
      } catch(e) {
        alert("Selected file is not InteractiveHtmlBom settings file.");
        return;
      }
      if (newSettings.type != "InteractiveHtmlBom settings") {
        alert("Selected file is not InteractiveHtmlBom settings file.");
        return;
      }
      var metadataMatches = newSettings.hasOwnProperty("pcbmetadata");
      if (metadataMatches) {
        for (var k in pcbdata.metadata) {
          if (!newSettings.pcbmetadata.hasOwnProperty(k) || newSettings.pcbmetadata[k] != pcbdata.metadata[k]) {
            metadataMatches = false;
          }
        }
      }
      if (!metadataMatches) {
        var currentMetadata = JSON.stringify(pcbdata.metadata, null, 4);
        var fileMetadata = JSON.stringify(newSettings.pcbmetadata, null, 4);
        if (!confirm(
          `Settins file metadata does not match current metadata.\n\n` +
          `Page metadata:\n${currentMetadata}\n\n` +
          `Settings file metadata:\n${fileMetadata}\n\n` +
          `Press OK if you would like to import settings anyway.`)) {
          return;
        }
      }
      overwriteSettings(newSettings.settings);
    }
    reader.readAsText(file, 'UTF-8');
  }
  input.click();
}

function overwriteSettings(newSettings) {
  initDone = false;
  Object.assign(settings, newSettings);
  writeStorage("bomlayout", settings.bomlayout);
  writeStorage("bommode", settings.bommode);
  writeStorage("canvaslayout", settings.canvaslayout);
  writeStorage("bomCheckboxes", settings.checkboxes.join(","));
  document.getElementById("bomCheckboxes").value = settings.checkboxes.join(",");
  for (var checkbox of settings.checkboxes) {
    writeStorage("checkbox_" + checkbox, settings.checkboxStoredRefs[checkbox]);
  }
  writeStorage("darkenWhenChecked", settings.darkenWhenChecked);
  padsVisible(settings.renderPads);
  document.getElementById("padsCheckbox").checked = settings.renderPads;
  fabricationVisible(settings.renderFabrication);
  document.getElementById("fabricationCheckbox").checked = settings.renderFabrication;
  silkscreenVisible(settings.renderSilkscreen);
  document.getElementById("silkscreenCheckbox").checked = settings.renderSilkscreen;
  referencesVisible(settings.renderReferences);
  document.getElementById("referencesCheckbox").checked = settings.renderReferences;
  valuesVisible(settings.renderValues);
  document.getElementById("valuesCheckbox").checked = settings.renderValues;
  tracksVisible(settings.renderTracks);
  document.getElementById("tracksCheckbox").checked = settings.renderTracks;
  zonesVisible(settings.renderZones);
  document.getElementById("zonesCheckbox").checked = settings.renderZones;
  dnpOutline(settings.renderDnpOutline);
  document.getElementById("dnpOutlineCheckbox").checked = settings.renderDnpOutline;
  setRedrawOnDrag(settings.redrawOnDrag);
  document.getElementById("dragCheckbox").checked = settings.redrawOnDrag;
  setDarkMode(settings.darkMode);
  document.getElementById("darkmodeCheckbox").checked = settings.darkMode;
  setHighlightPin1(settings.highlightpin1);
  document.getElementById("highlightpin1Checkbox").checked = settings.highlightpin1;
  writeStorage("boardRotation", settings.boardRotation);
  document.getElementById("boardRotation").value = settings.boardRotation / 5;
  document.getElementById("rotationDegree").textContent = settings.boardRotation;
  initDone = true;
  prepCheckboxes();
  changeBomLayout(settings.bomlayout);
}

function saveFile(filename, blob) {
  var link = document.createElement("a");
  var objurl = URL.createObjectURL(blob);
  link.download = filename;
  link.href = objurl;
  link.click();
}

function dataURLtoBlob(dataurl) {
  var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
      bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
  while(n--){
      u8arr[n] = bstr.charCodeAt(n);
  }
  return new Blob([u8arr], {type:mime});
}

var settings = {
  canvaslayout: "default",
  bomlayout: "default",
  bommode: "grouped",
  checkboxes: [],
  checkboxStoredRefs: {},
  darkMode: false,
  highlightpin1: false,
  redrawOnDrag: true,
  boardRotation: 0,
  renderPads: true,
  renderReferences: true,
  renderValues: true,
  renderSilkscreen: true,
  renderFabrication: true,
  renderDnpOutline: false,
  renderTracks: true,
  renderZones: true,
}

function initDefaults() {
  settings.bomlayout = readStorage("bomlayout");
  if (settings.bomlayout === null) {
    settings.bomlayout = config.bom_view;
  }
  if (!['bom-only', 'left-right', 'top-bottom'].includes(settings.bomlayout)) {
    settings.bomlayout = config.bom_view;
  }
  settings.bommode = readStorage("bommode");
  if (settings.bommode === null) {
    settings.bommode = "grouped";
  }
  if (!["grouped", "ungrouped", "netlist"].includes(settings.bommode)) {
    settings.bommode = "grouped";
  }
  settings.canvaslayout = readStorage("canvaslayout");
  if (settings.canvaslayout === null) {
    settings.canvaslayout = config.layer_view;
  }
  var bomCheckboxes = readStorage("bomCheckboxes");
  if (bomCheckboxes === null) {
    bomCheckboxes = config.checkboxes;
  }
  settings.checkboxes = bomCheckboxes.split(",").filter((e) => e);
  document.getElementById("bomCheckboxes").value = bomCheckboxes;

  settings.darkenWhenChecked = readStorage("darkenWhenChecked") || "";
  populateDarkenWhenCheckedOptions();

  function initBooleanSetting(storageString, def, elementId, func) {
    var b = readStorage(storageString);
    if (b === null) {
      b = def;
    } else {
      b = (b == "true");
    }
    document.getElementById(elementId).checked = b;
    func(b);
  }

  initBooleanSetting("padsVisible", config.show_pads, "padsCheckbox", padsVisible);
  initBooleanSetting("fabricationVisible", config.show_fabrication, "fabricationCheckbox", fabricationVisible);
  initBooleanSetting("silkscreenVisible", config.show_silkscreen, "silkscreenCheckbox", silkscreenVisible);
  initBooleanSetting("referencesVisible", true, "referencesCheckbox", referencesVisible);
  initBooleanSetting("valuesVisible", true, "valuesCheckbox", valuesVisible);
  if ("tracks" in pcbdata) {
    initBooleanSetting("tracksVisible", true, "tracksCheckbox", tracksVisible);
    initBooleanSetting("zonesVisible", true, "zonesCheckbox", zonesVisible);
  } else {
    document.getElementById("tracksAndZonesCheckboxes").style.display = "none";
    tracksVisible(false);
    zonesVisible(false);
  }
  initBooleanSetting("dnpOutline", false, "dnpOutlineCheckbox", dnpOutline);
  initBooleanSetting("redrawOnDrag", config.redraw_on_drag, "dragCheckbox", setRedrawOnDrag);
  initBooleanSetting("darkmode", config.dark_mode, "darkmodeCheckbox", setDarkMode);
  initBooleanSetting("highlightpin1", config.highlight_pin1, "highlightpin1Checkbox", setHighlightPin1);
  settings.boardRotation = readStorage("boardRotation");
  if (settings.boardRotation === null) {
    settings.boardRotation = config.board_rotation * 5;
  } else {
    settings.boardRotation = parseInt(settings.boardRotation);
  }
  document.getElementById("boardRotation").value = settings.boardRotation / 5;
  document.getElementById("rotationDegree").textContent = settings.boardRotation;
}

// Helper classes for user js callbacks.

const IBOM_EVENT_TYPES = {
  ALL: "all",
  HIGHLIGHT_EVENT: "highlightEvent",
  CHECKBOX_CHANGE_EVENT: "checkboxChangeEvent",
  BOM_BODY_CHANGE_EVENT: "bomBodyChangeEvent",
}

const EventHandler = {
  callbacks: {},
  init: function() {
    for (eventType of Object.values(IBOM_EVENT_TYPES))
      this.callbacks[eventType] = [];
  },
  registerCallback: function(eventType, callback) {
    this.callbacks[eventType].push(callback);
  },
  emitEvent: function(eventType, eventArgs) {
    event = {
      eventType: eventType,
      args: eventArgs,
    }
    var callback;
    for(callback of this.callbacks[eventType])
      callback(event);
    for(callback of this.callbacks[IBOM_EVENT_TYPES.ALL])
      callback(event);
  }
}
EventHandler.init();

///////////////////////////////////////////////

///////////////////////////////////////////////
/* PCB rendering code */

var emptyContext2d = document.createElement("canvas").getContext("2d");

function deg2rad(deg) {
  return deg * Math.PI / 180;
}

function calcFontPoint(linepoint, text, offsetx, offsety, tilt) {
  var point = [
    linepoint[0] * text.width + offsetx,
    linepoint[1] * text.height + offsety
  ];
  // This approximates pcbnew behavior with how text tilts depending on horizontal justification
  point[0] -= (linepoint[1] + 0.5 * (1 + text.horiz_justify)) * text.height * tilt;
  return point;
}

function drawtext(ctx, text, color, flip) {
  if ("ref" in text && !settings.renderReferences) return;
  if ("val" in text && !settings.renderValues) return;
  ctx.save();
  ctx.fillStyle = color;
  ctx.strokeStyle = color;
  ctx.lineCap = "round";
  ctx.lineJoin = "round";
  ctx.lineWidth = text.thickness;
  if (text.svgpath) {
    ctx.stroke(new Path2D(text.svgpath));
    ctx.restore();
    return;
  }
  ctx.translate(...text.pos);
  ctx.translate(text.thickness * 0.5, 0);
  var angle = -text.angle;
  if (text.attr.includes("mirrored")) {
    ctx.scale(-1, 1);
    angle = -angle;
  }
  var tilt = 0;
  if (text.attr.includes("italic")) {
    tilt = 0.125;
  }
  var interline = (text.height * 1.5 + text.thickness) / 2;
  var txt = text.text.split("\n");
  // KiCad ignores last empty line.
  if (txt[txt.length - 1] == '') txt.pop();
  ctx.rotate(deg2rad(angle));
  for (var i in txt) {
    var offsety = (-(txt.length - 1) + i * 2) * interline + text.height / 2;
    var lineWidth = text.thickness + interline * tilt;
    for (var j = 0; j < txt[i].length; j++) {
      if (txt[i][j] == '\t') {
        var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
        lineWidth += fourSpaces - lineWidth % fourSpaces;
      } else {
        if (txt[i][j] == '~') {
          j++;
          if (j == txt[i].length)
            break;
        }
        lineWidth += pcbdata.font_data[txt[i][j]].w * text.width;
      }
    }
    var offsetx = 0;
    switch (text.horiz_justify) {
      case -1:
        // Justify left, do nothing
        break;
      case 0:
        // Justify center
        offsetx -= lineWidth / 2;
        break;
      case 1:
        // Justify right
        offsetx -= lineWidth;
        break;
    }
    var inOverbar = false;
    for (var j = 0; j < txt[i].length; j++) {
      if (txt[i][j] == '\t') {
        var fourSpaces = 4 * pcbdata.font_data[' '].w * text.width;
        offsetx += fourSpaces - offsetx % fourSpaces;
        continue;
      } else if (txt[i][j] == '~') {
        j++;
        if (j == txt[i].length)
          break;
        if (txt[i][j] != '~') {
          inOverbar = !inOverbar;
        }
      }
      var glyph = pcbdata.font_data[txt[i][j]];
      if (inOverbar) {
        var overbarStart = [offsetx, -text.height * 1.4 + offsety];
        var overbarEnd = [offsetx + text.width * glyph.w, overbarStart[1]];

        if (!lastHadOverbar) {
          overbarStart[0] += text.height * 1.4 * tilt;
          lastHadOverbar = true;
        }
        ctx.beginPath();
        ctx.moveTo(...overbarStart);
        ctx.lineTo(...overbarEnd);
        ctx.stroke();
      } else {
        lastHadOverbar = false;
      }
      for (var line of glyph.l) {
        ctx.beginPath();
        ctx.moveTo(...calcFontPoint(line[0], text, offsetx, offsety, tilt));
        for (var k = 1; k < line.length; k++) {
          ctx.lineTo(...calcFontPoint(line[k], text, offsetx, offsety, tilt));
        }
        ctx.stroke();
      }
      offsetx += glyph.w * text.width;
    }
  }
  ctx.restore();
}

function drawedge(ctx, scalefactor, edge, color) {
  ctx.strokeStyle = color;
  ctx.lineWidth = Math.max(1 / scalefactor, edge.width);
  ctx.lineCap = "round";
  if (edge.svgpath) {
    ctx.stroke(new Path2D(edge.svgpath));
  } else {
    ctx.beginPath();
    if (edge.type == "segment") {
      ctx.moveTo(...edge.start);
      ctx.lineTo(...edge.end);
    }
    if (edge.type == "arc") {
      ctx.arc(
        ...edge.start,
        edge.radius,
        deg2rad(edge.startangle),
        deg2rad(edge.endangle));
    }
    if (edge.type == "circle") {
      ctx.arc(
        ...edge.start,
        edge.radius,
        0, 2 * Math.PI);
      ctx.closePath();
    }
    if (edge.type == "curve") {
      ctx.moveTo(...edge.start);
      ctx.bezierCurveTo(...edge.cpa, ...edge.cpb, ...edge.end);
    }
    ctx.stroke();
  }
}

function getChamferedRectPath(size, radius, chamfpos, chamfratio) {
  // chamfpos is a bitmask, left = 1, right = 2, bottom left = 4, bottom right = 8
  var path = new Path2D();
  var width = size[0];
  var height = size[1];
  var x = width * -0.5;
  var y = height * -0.5;
  var chamfOffset = Math.min(width, height) * chamfratio;
  path.moveTo(x, 0);
  if (chamfpos & 4) {
    path.lineTo(x, y + height - chamfOffset);
    path.lineTo(x + chamfOffset, y + height);
    path.lineTo(0, y + height);
  } else {
    path.arcTo(x, y + height, x + width, y + height, radius);
  }
  if (chamfpos & 8) {
    path.lineTo(x + width - chamfOffset, y + height);
    path.lineTo(x + width, y + height - chamfOffset);
    path.lineTo(x + width, 0);
  } else {
    path.arcTo(x + width, y + height, x + width, y, radius);
  }
  if (chamfpos & 2) {
    path.lineTo(x + width, y + chamfOffset);
    path.lineTo(x + width - chamfOffset, y);
    path.lineTo(0, y);
  } else {
    path.arcTo(x + width, y, x, y, radius);
  }
  if (chamfpos & 1) {
    path.lineTo(x + chamfOffset, y);
    path.lineTo(x, y + chamfOffset);
    path.lineTo(x, 0);
  } else {
    path.arcTo(x, y, x, y + height, radius);
  }
  path.closePath();
  return path;
}

function getOblongPath(size) {
  return getChamferedRectPath(size, Math.min(size[0], size[1]) / 2, 0, 0);
}

function getPolygonsPath(shape) {
  if (shape.path2d) {
    return shape.path2d;
  }
  if (shape.svgpath) {
    shape.path2d = new Path2D(shape.svgpath);
  } else {
    var path = new Path2D();
    for (var polygon of shape.polygons) {
      path.moveTo(...polygon[0]);
      for (var i = 1; i < polygon.length; i++) {
        path.lineTo(...polygon[i]);
      }
      path.closePath();
    }
    shape.path2d = path;
  }
  return shape.path2d;
}

function drawPolygonShape(ctx, shape, color) {
  ctx.save();
  ctx.fillStyle = color;
  if (!shape.svgpath) {
    ctx.translate(...shape.pos);
    ctx.rotate(deg2rad(-shape.angle));
  }
  ctx.fill(getPolygonsPath(shape));
  ctx.restore();
}

function drawDrawing(ctx, layer, scalefactor, drawing, color) {
  if (["segment", "arc", "circle", "curve"].includes(drawing.type)) {
    drawedge(ctx, scalefactor, drawing, color);
  } else if (drawing.type == "polygon") {
    drawPolygonShape(ctx, drawing, color);
  } else {
    drawtext(ctx, drawing, color, layer == "B");
  }
}

function getCirclePath(radius) {
  var path = new Path2D();
  path.arc(0, 0, radius, 0, 2 * Math.PI);
  path.closePath();
  return path;
}

function getCachedPadPath(pad) {
  if (!pad.path2d) {
    // if path2d is not set, build one and cache it on pad object
    if (pad.shape == "rect") {
      pad.path2d = new Path2D();
      pad.path2d.rect(...pad.size.map(c => -c * 0.5), ...pad.size);
    } else if (pad.shape == "oval") {
      pad.path2d = getOblongPath(pad.size);
    } else if (pad.shape == "circle") {
      pad.path2d = getCirclePath(pad.size[0] / 2);
    } else if (pad.shape == "roundrect") {
      pad.path2d = getChamferedRectPath(pad.size, pad.radius, 0, 0);
    } else if (pad.shape == "chamfrect") {
      pad.path2d = getChamferedRectPath(pad.size, pad.radius, pad.chamfpos, pad.chamfratio)
    } else if (pad.shape == "custom") {
      pad.path2d = getPolygonsPath(pad);
    }
  }
  return pad.path2d;
}

function drawPad(ctx, pad, color, outline, hole) {
  ctx.save();
  ctx.translate(...pad.pos);
  ctx.rotate(deg2rad(pad.angle));
  if (pad.offset) {
    ctx.translate(...pad.offset);
  }
  ctx.fillStyle = color;
  ctx.strokeStyle = color;
  var path = getCachedPadPath(pad);
  if (outline) {
    ctx.stroke(path);
  } else {
    ctx.fill(path);
  }
  if (pad.type == "th" && hole) {
    if (pad.offset) {
      ctx.translate(-pad.offset[0], -pad.offset[1]);
    }
    ctx.fillStyle = "#CCCCCC";
    if (pad.drillshape == "oblong") {
      ctx.fill(getOblongPath(pad.drillsize));
    } else {
      ctx.fill(getCirclePath(pad.drillsize[0] / 2));
    }
  }
  ctx.restore();
}

function drawModule(ctx, layer, scalefactor, module, padcolor, outlinecolor, highlight, outline) {
  if (highlight) {
    // draw bounding box
    if (module.layer == layer) {
      ctx.save();
      ctx.globalAlpha = 0.2;
      ctx.translate(...module.bbox.pos);
      ctx.rotate(deg2rad(-module.bbox.angle));
      ctx.translate(...module.bbox.relpos);
      ctx.fillStyle = padcolor;
      ctx.fillRect(0, 0, ...module.bbox.size);
      ctx.globalAlpha = 1;
      ctx.strokeStyle = padcolor;
      ctx.strokeRect(0, 0, ...module.bbox.size);
      ctx.restore();
    }
  }
  // draw drawings
  for (var drawing of module.drawings) {
    if (drawing.layer == layer) {
      drawDrawing(ctx, layer, scalefactor, drawing.drawing, padcolor);
    }
  }
  // draw pads
  if (settings.renderPads) {
    for (var pad of module.pads) {
      if (pad.layers.includes(layer)) {
        drawPad(ctx, pad, padcolor, outline, true);
        if (pad.pin1 && settings.highlightpin1) {
          drawPad(ctx, pad, outlinecolor, true, false);
        }
      }
    }
  }
}

function drawEdgeCuts(canvas, scalefactor) {
  var ctx = canvas.getContext("2d");
  var edgecolor = getComputedStyle(topmostdiv).getPropertyValue('--pcb-edge-color');
  for (var edge of pcbdata.edges) {
    drawedge(ctx, scalefactor, edge, edgecolor);
  }
}

function drawModules(canvas, layer, scalefactor, highlight) {
  var ctx = canvas.getContext("2d");
  ctx.lineWidth = 3 / scalefactor;
  var style = getComputedStyle(topmostdiv);
  var padcolor = style.getPropertyValue('--pad-color');
  var outlinecolor = style.getPropertyValue('--pin1-outline-color');
  if (highlight) {
    padcolor = style.getPropertyValue('--pad-color-highlight');
    outlinecolor = style.getPropertyValue('--pin1-outline-color-highlight');
  }
  for (var i = 0; i < pcbdata.modules.length; i++) {
    var mod = pcbdata.modules[i];
    var outline = settings.renderDnpOutline && pcbdata.bom.skipped.includes(i);
    if (!highlight || highlightedModules.includes(i)) {
      drawModule(ctx, layer, scalefactor, mod, padcolor, outlinecolor, highlight, outline);
    }
  }
}

function drawBgLayer(layername, canvas, layer, scalefactor, edgeColor, polygonColor, textColor) {
  var ctx = canvas.getContext("2d");
  for (var d of pcbdata[layername][layer]) {
    if (["segment", "arc", "circle", "curve"].includes(d.type)) {
      drawedge(ctx, scalefactor, d, edgeColor);
    } else if (d.type == "polygon") {
      drawPolygonShape(ctx, d, polygonColor);
    } else {
      drawtext(ctx, d, textColor, layer == "B");
    }
  }
}

function drawTracks(canvas, layer, color, highlight) {
  ctx = canvas.getContext("2d");
  ctx.strokeStyle = color;
  ctx.lineCap = "round";
  for(var track of pcbdata.tracks[layer]) {
    if (highlight && highlightedNet != track.net) continue;
    ctx.lineWidth = track.width;
    ctx.beginPath();
    ctx.moveTo(...track.start);
    ctx.lineTo(...track.end);
    ctx.stroke();
  }
}

function drawZones(canvas, layer, color, highlight) {
  ctx = canvas.getContext("2d");
  ctx.strokeStyle = color;
  ctx.fillStyle = color;
  ctx.lineJoin = "round";
  for(var zone of pcbdata.zones[layer]) {
    if (!zone.path2d) {
      zone.path2d = getPolygonsPath(zone);
    }
    if (highlight && highlightedNet != zone.net) continue;
    ctx.lineWidth = zone.width ? zone.width : 0;
    ctx.fill(zone.path2d);
    ctx.stroke(zone.path2d);
  }
}

function clearCanvas(canvas, color = null) {
  var ctx = canvas.getContext("2d");
  ctx.save();
  ctx.setTransform(1, 0, 0, 1, 0, 0);
  if (color) {
    ctx.fillStyle = color;
    ctx.fillRect(0, 0, canvas.width, canvas.height);
  } else {
    ctx.clearRect(0, 0, canvas.width, canvas.height);
  }
  ctx.restore();
}

function drawNets(canvas, layer, highlight) {
  var style = getComputedStyle(topmostdiv);
  if (settings.renderTracks) {
    var trackColor = style.getPropertyValue(highlight ? '--track-color-highlight' : '--track-color');
    drawTracks(canvas, layer, trackColor, highlight);
  }
  if (settings.renderZones) {
    var zoneColor = style.getPropertyValue(highlight ? '--zone-color-highlight' : '--zone-color');
    drawZones(canvas, layer, zoneColor, highlight);
  }
  if (highlight && settings.renderPads) {
    var padColor = style.getPropertyValue('--pad-color-highlight');
    var ctx = canvas.getContext("2d");
    for (var mod of pcbdata.modules) {
      // draw pads
      for (var pad of mod.pads) {
        if (highlightedNet != pad.net) continue;
        if (pad.layers.includes(layer)) {
          drawPad(ctx, pad, padColor, false, true);
        }
      }
    }
  }
}

function drawHighlightsOnLayer(canvasdict, clear = true) {
  if (clear) {
    clearCanvas(canvasdict.highlight);
  }
  if (highlightedModules.length > 0) {
    drawModules(canvasdict.highlight, canvasdict.layer,
      canvasdict.transform.s * canvasdict.transform.zoom, true);
  }
  if (highlightedNet !== null) {
    drawNets(canvasdict.highlight, canvasdict.layer, true);
  }
}

function drawHighlights() {
  drawHighlightsOnLayer(allcanvas.front);
  drawHighlightsOnLayer(allcanvas.back);
}

function drawBackground(canvasdict, clear = true) {
  if (clear) {
    clearCanvas(canvasdict.bg);
    clearCanvas(canvasdict.fab);
    clearCanvas(canvasdict.silk);
  }

  drawNets(canvasdict.bg, canvasdict.layer, false);
  drawModules(canvasdict.bg, canvasdict.layer,
    canvasdict.transform.s * canvasdict.transform.zoom, false);

  drawEdgeCuts(canvasdict.bg, canvasdict.transform.s);

  var style = getComputedStyle(topmostdiv);
  var edgeColor = style.getPropertyValue('--silkscreen-edge-color');
  var polygonColor = style.getPropertyValue('--silkscreen-polygon-color');
  var textColor = style.getPropertyValue('--silkscreen-text-color');
  if (settings.renderSilkscreen) {
    drawBgLayer(
      "silkscreen", canvasdict.silk, canvasdict.layer,
      canvasdict.transform.s * canvasdict.transform.zoom,
      edgeColor, polygonColor, textColor);
  }
  edgeColor = style.getPropertyValue('--fabrication-edge-color');
  polygonColor = style.getPropertyValue('--fabrication-polygon-color');
  textColor = style.getPropertyValue('--fabrication-text-color');
  if (settings.renderFabrication) {
    drawBgLayer(
      "fabrication", canvasdict.fab, canvasdict.layer,
      canvasdict.transform.s * canvasdict.transform.zoom,
      edgeColor, polygonColor, textColor);
  }
}

function prepareCanvas(canvas, flip, transform) {
  var ctx = canvas.getContext("2d");
  ctx.setTransform(1, 0, 0, 1, 0, 0);
  var fontsize = 1.55;
  ctx.scale(transform.zoom, transform.zoom);
  ctx.translate(transform.panx, transform.pany);
  if (flip) {
    ctx.scale(-1, 1);
  }
  ctx.translate(transform.x, transform.y);
  ctx.rotate(deg2rad(settings.boardRotation));
  ctx.scale(transform.s, transform.s);
}

function prepareLayer(canvasdict) {
  var flip = (canvasdict.layer == "B");
  for (var c of ["bg", "fab", "silk", "highlight"]) {
    prepareCanvas(canvasdict[c], flip, canvasdict.transform);
  }
}

function rotateVector(v, angle) {
  angle = deg2rad(angle);
  return [
    v[0] * Math.cos(angle) - v[1] * Math.sin(angle),
    v[0] * Math.sin(angle) + v[1] * Math.cos(angle)
  ];
}

function applyRotation(bbox) {
  var corners = [
    [bbox.minx, bbox.miny],
    [bbox.minx, bbox.maxy],
    [bbox.maxx, bbox.miny],
    [bbox.maxx, bbox.maxy],
  ];
  corners = corners.map((v) => rotateVector(v, settings.boardRotation));
  return {
    minx: corners.reduce((a, v) => Math.min(a, v[0]), Infinity),
    miny: corners.reduce((a, v) => Math.min(a, v[1]), Infinity),
    maxx: corners.reduce((a, v) => Math.max(a, v[0]), -Infinity),
    maxy: corners.reduce((a, v) => Math.max(a, v[1]), -Infinity),
  }
}

function recalcLayerScale(layerdict, width, height) {
  var bbox = applyRotation(pcbdata.edges_bbox);
  var scalefactor = 0.98 * Math.min(
    width / (bbox.maxx - bbox.minx),
    height / (bbox.maxy - bbox.miny)
  );
  if (scalefactor < 0.1) {
    scalefactor = 1;
  }
  layerdict.transform.s = scalefactor;
  var flip = (layerdict.layer == "B");
  if (flip) {
    layerdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor + width) * 0.5;
  } else {
    layerdict.transform.x = -((bbox.maxx + bbox.minx) * scalefactor - width) * 0.5;
  }
  layerdict.transform.y = -((bbox.maxy + bbox.miny) * scalefactor - height) * 0.5;
  for (var c of ["bg", "fab", "silk", "highlight"]) {
    canvas = layerdict[c];
    canvas.width = width;
    canvas.height = height;
    canvas.style.width = (width / devicePixelRatio) + "px";
    canvas.style.height = (height / devicePixelRatio) + "px";
  }
}

function redrawCanvas(layerdict) {
  prepareLayer(layerdict);
  drawBackground(layerdict);
  drawHighlightsOnLayer(layerdict);
}

function resizeCanvas(layerdict) {
  var canvasdivid = {
    "F": "frontcanvas",
    "B": "backcanvas"
  } [layerdict.layer];
  var width = document.getElementById(canvasdivid).clientWidth * devicePixelRatio;
  var height = document.getElementById(canvasdivid).clientHeight * devicePixelRatio;
  recalcLayerScale(layerdict, width, height);
  redrawCanvas(layerdict);
}

function resizeAll() {
  resizeCanvas(allcanvas.front);
  resizeCanvas(allcanvas.back);
}

function pointWithinDistanceToSegment(x, y, x1, y1, x2, y2, d) {
  var A = x - x1;
  var B = y - y1;
  var C = x2 - x1;
  var D = y2 - y1;

  var dot = A * C + B * D;
  var len_sq = C * C + D * D;
  var dx, dy;
  if (len_sq == 0) {
    // start and end of the segment coincide
    dx = x - x1;
    dy = y - y1;
  } else {
    var param = dot / len_sq;
    var xx, yy;
    if (param < 0) {
      xx = x1;
      yy = y1;
    } else if (param > 1) {
      xx = x2;
      yy = y2;
    } else {
      xx = x1 + param * C;
      yy = y1 + param * D;
    }
    dx = x - xx;
    dy = y - yy;
  }
  return dx * dx + dy * dy <= d * d;
}

function pointWithinPad(x, y, pad) {
  var v = [x - pad.pos[0], y - pad.pos[1]];
  v = rotateVector(v, -pad.angle);
  if (pad.offset) {
    v[0] -= pad.offset[0];
    v[1] -= pad.offset[1];
  }
  return emptyContext2d.isPointInPath(getCachedPadPath(pad), ...v);
}

function netHitScan(layer, x, y) {
  // Check track segments
  if (settings.renderTracks && pcbdata.tracks) {
    for(var track of pcbdata.tracks[layer]) {
      if (pointWithinDistanceToSegment(x, y, ...track.start, ...track.end, track.width / 2)) {
        return track.net;
      }
    }
  }
  // Check pads
  if (settings.renderPads) {
    for (var mod of pcbdata.modules) {
      for(var pad of mod.pads) {
        if (pad.layers.includes(layer) && pointWithinPad(x, y, pad)) {
          return pad.net;
        }
      }
    }
  }
  return null;
}

function pointWithinModuleBbox(x, y, bbox) {
  var v = [x - bbox.pos[0], y - bbox.pos[1]];
  v = rotateVector(v, bbox.angle);
  return bbox.relpos[0] <= v[0] && v[0] <= bbox.relpos[0] + bbox.size[0] &&
         bbox.relpos[1] <= v[1] && v[1] <= bbox.relpos[1] + bbox.size[1];
}

function bboxHitScan(layer, x, y) {
  var result = [];
  for (var i = 0; i < pcbdata.modules.length; i++) {
    var module = pcbdata.modules[i];
    if (module.layer == layer) {
      if (pointWithinModuleBbox(x, y, module.bbox)) {
        result.push(i);
      }
    }
  }
  return result;
}

function handlePointerDown(e, layerdict) {
  if (e.button != 0 && e.button != 1) {
    return;
  }
  e.preventDefault();
  e.stopPropagation();

  if (!e.hasOwnProperty("offsetX")) {
    // The polyfill doesn't set this properly
    e.offsetX = e.pageX - e.currentTarget.offsetLeft;
    e.offsetY = e.pageY - e.currentTarget.offsetTop;
  }

  layerdict.pointerStates[e.pointerId] = {
    distanceTravelled: 0,
    lastX: e.offsetX,
    lastY: e.offsetY,
    downTime: Date.now(),
  };
}

function handleMouseClick(e, layerdict) {
  if (!e.hasOwnProperty("offsetX")) {
    // The polyfill doesn't set this properly
    e.offsetX = e.pageX - e.currentTarget.offsetLeft;
    e.offsetY = e.pageY - e.currentTarget.offsetTop;
  }

  var x = e.offsetX;
  var y = e.offsetY;
  var t = layerdict.transform;
  if (layerdict.layer == "B") {
    x = (devicePixelRatio * x / t.zoom - t.panx + t.x) / -t.s;
  } else {
    x = (devicePixelRatio * x / t.zoom - t.panx - t.x) / t.s;
  }
  y = (devicePixelRatio * y / t.zoom - t.y - t.pany) / t.s;
  var v = rotateVector([x, y], -settings.boardRotation);
  if ("nets" in pcbdata) {
    var net = netHitScan(layerdict.layer, ...v);
    if (net !== highlightedNet) {
      netClicked(net);
    }
  }
  if (highlightedNet === null) {
    var modules = bboxHitScan(layerdict.layer, ...v);
    if (modules.length > 0) {
      modulesClicked(modules);
    }
  }
}

function handlePointerLeave(e, layerdict) {
  e.preventDefault();
  e.stopPropagation();

  if (!settings.redrawOnDrag) {
    redrawCanvas(layerdict);
  }

  delete layerdict.pointerStates[e.pointerId];
}

function resetTransform(layerdict) {
  layerdict.transform.panx = 0;
  layerdict.transform.pany = 0;
  layerdict.transform.zoom = 1;
  redrawCanvas(layerdict);
}

function handlePointerUp(e, layerdict) {
  if (!e.hasOwnProperty("offsetX")) {
    // The polyfill doesn't set this properly
    e.offsetX = e.pageX - e.currentTarget.offsetLeft;
    e.offsetY = e.pageY - e.currentTarget.offsetTop;
  }

  e.preventDefault();
  e.stopPropagation();

  if (e.button == 2) {
    // Reset pan and zoom on right click.
    resetTransform(layerdict);
    layerdict.anotherPointerTapped = false;
    return;
  }

  // We haven't necessarily had a pointermove event since the interaction started, so make sure we update this now
  var ptr = layerdict.pointerStates[e.pointerId];
  ptr.distanceTravelled += Math.abs(e.offsetX - ptr.lastX) + Math.abs(e.offsetY - ptr.lastY);

  if (e.button == 0 && ptr.distanceTravelled < 10 && Date.now() - ptr.downTime <= 500) {
    if (Object.keys(layerdict.pointerStates).length == 1) {
      if (layerdict.anotherPointerTapped) {
        // This is the second pointer coming off of a two-finger tap
        resetTransform(layerdict);
      } else {
        // This is just a regular tap
        handleMouseClick(e, layerdict);
      }
      layerdict.anotherPointerTapped = false;
    } else {
      // This is the first finger coming off of what could become a two-finger tap
      layerdict.anotherPointerTapped = true;
    }
  } else {
    if (!settings.redrawOnDrag) {
      redrawCanvas(layerdict);
    }
    layerdict.anotherPointerTapped = false;
  }

  delete layerdict.pointerStates[e.pointerId];
}

function handlePointerMove(e, layerdict) {
  if (!layerdict.pointerStates.hasOwnProperty(e.pointerId)) {
    return;
  }
  e.preventDefault();
  e.stopPropagation();

  if (!e.hasOwnProperty("offsetX")) {
    // The polyfill doesn't set this properly
    e.offsetX = e.pageX - e.currentTarget.offsetLeft;
    e.offsetY = e.pageY - e.currentTarget.offsetTop;
  }

  var thisPtr = layerdict.pointerStates[e.pointerId];

  var dx = e.offsetX - thisPtr.lastX;
  var dy = e.offsetY - thisPtr.lastY;

  // If this number is low on pointer up, we count the action as a click
  thisPtr.distanceTravelled += Math.abs(dx) + Math.abs(dy);

  if (Object.keys(layerdict.pointerStates).length == 1) {
    // This is a simple drag
    layerdict.transform.panx += devicePixelRatio * dx / layerdict.transform.zoom;
    layerdict.transform.pany += devicePixelRatio * dy / layerdict.transform.zoom;
  } else if (Object.keys(layerdict.pointerStates).length == 2) {
    var otherPtr = Object.values(layerdict.pointerStates).filter((ptr) => ptr != thisPtr)[0];

    var oldDist = Math.sqrt(Math.pow(thisPtr.lastX - otherPtr.lastX, 2) + Math.pow(thisPtr.lastY - otherPtr.lastY, 2));
    var newDist = Math.sqrt(Math.pow(e.offsetX - otherPtr.lastX, 2)     + Math.pow(e.offsetY - otherPtr.lastY, 2));

    var scaleFactor = newDist/oldDist;

    if (scaleFactor != NaN) {
      layerdict.transform.zoom *= scaleFactor;

      var zoomd = (1 - scaleFactor) / layerdict.transform.zoom;
      layerdict.transform.panx += devicePixelRatio * otherPtr.lastX * zoomd;
      layerdict.transform.pany += devicePixelRatio * otherPtr.lastY * zoomd;
    }
  }

  thisPtr.lastX = e.offsetX;
  thisPtr.lastY = e.offsetY;

  if (settings.redrawOnDrag) {
    redrawCanvas(layerdict);
  }
}

function handleMouseWheel(e, layerdict) {
  e.preventDefault();
  e.stopPropagation();
  var t = layerdict.transform;
  var wheeldelta = e.deltaY;
  if (e.deltaMode == 1) {
    // FF only, scroll by lines
    wheeldelta *= 30;
  } else if (e.deltaMode == 2) {
    wheeldelta *= 300;
  }
  var m = Math.pow(1.1, -wheeldelta / 40);
  // Limit amount of zoom per tick.
  if (m > 2) {
    m = 2;
  } else if (m < 0.5) {
    m = 0.5;
  }
  t.zoom *= m;
  var zoomd = (1 - m) / t.zoom;
  t.panx += devicePixelRatio * e.offsetX * zoomd;
  t.pany += devicePixelRatio * e.offsetY * zoomd;
  redrawCanvas(layerdict);
}

function addMouseHandlers(div, layerdict) {
  div.addEventListener("pointerdown", function(e) {
    handlePointerDown(e, layerdict);
  });
  div.addEventListener("pointermove", function(e) {
    handlePointerMove(e, layerdict);
  });
  div.addEventListener("pointerup", function(e) {
    handlePointerUp(e, layerdict);
  });
  var pointerleave = function(e) {
    handlePointerLeave(e, layerdict);
  }
  div.addEventListener("pointercancel", pointerleave);
  div.addEventListener("pointerleave", pointerleave);
  div.addEventListener("pointerout", pointerleave);

  div.onwheel = function(e) {
    handleMouseWheel(e, layerdict);
  }
  for (var element of [div, layerdict.bg, layerdict.fab, layerdict.silk, layerdict.highlight]) {
    element.addEventListener("contextmenu", function(e) {
      e.preventDefault();
    }, false);
  }
}

function setRedrawOnDrag(value) {
  settings.redrawOnDrag = value;
  writeStorage("redrawOnDrag", value);
}

function setBoardRotation(value) {
  settings.boardRotation = value * 5;
  writeStorage("boardRotation", settings.boardRotation);
  document.getElementById("rotationDegree").textContent = settings.boardRotation;
  resizeAll();
}

function initRender() {
  allcanvas = {
    front: {
      transform: {
        x: 0,
        y: 0,
        s: 1,
        panx: 0,
        pany: 0,
        zoom: 1,
      },
      pointerStates: {},
      anotherPointerTapped: false,
      bg: document.getElementById("F_bg"),
      fab: document.getElementById("F_fab"),
      silk: document.getElementById("F_slk"),
      highlight: document.getElementById("F_hl"),
      layer: "F",
    },
    back: {
      transform: {
        x: 0,
        y: 0,
        s: 1,
        panx: 0,
        pany: 0,
        zoom: 1,
      },
      pointerStates: {},
      anotherPointerTapped: false,
      bg: document.getElementById("B_bg"),
      fab: document.getElementById("B_fab"),
      silk: document.getElementById("B_slk"),
      highlight: document.getElementById("B_hl"),
      layer: "B",
    }
  };
  addMouseHandlers(document.getElementById("frontcanvas"), allcanvas.front);
  addMouseHandlers(document.getElementById("backcanvas"), allcanvas.back);
}

///////////////////////////////////////////////

///////////////////////////////////////////////
/* DOM manipulation and misc code */

var bomsplit;
var canvassplit;
var initDone = false;
var bomSortFunction = null;
var currentSortColumn = null;
var currentSortOrder = null;
var currentHighlightedRowId;
var highlightHandlers = [];
var moduleIndexToHandler = {};
var netsToHandler = {};
var highlightedModules = [];
var highlightedNet = null;
var lastClicked;

function dbg(html) {
  dbgdiv.innerHTML = html;
}

function redrawIfInitDone() {
  if (initDone) {
    redrawCanvas(allcanvas.front);
    redrawCanvas(allcanvas.back);
  }
}

function padsVisible(value) {
  writeStorage("padsVisible", value);
  settings.renderPads = value;
  redrawIfInitDone();
}

function referencesVisible(value) {
  writeStorage("referencesVisible", value);
  settings.renderReferences = value;
  redrawIfInitDone();
}

function valuesVisible(value) {
  writeStorage("valuesVisible", value);
  settings.renderValues = value;
  redrawIfInitDone();
}

function tracksVisible(value) {
  writeStorage("tracksVisible", value);
  settings.renderTracks = value;
  redrawIfInitDone();
}

function zonesVisible(value) {
  writeStorage("zonesVisible", value);
  settings.renderZones = value;
  redrawIfInitDone();
}

function dnpOutline(value) {
  writeStorage("dnpOutline", value);
  settings.renderDnpOutline = value;
  redrawIfInitDone();
}

function setDarkMode(value) {
  if (value) {
    topmostdiv.classList.add("dark");
  } else {
    topmostdiv.classList.remove("dark");
  }
  writeStorage("darkmode", value);
  settings.darkMode = value;
  redrawIfInitDone();
}

function setFullscreen(value) {
  if (value) {
    document.documentElement.requestFullscreen();
  } else {
    document.exitFullscreen();
  }
}

function fabricationVisible(value) {
  writeStorage("fabricationVisible", value);
  settings.renderFabrication = value;
  redrawIfInitDone();
}

function silkscreenVisible(value) {
  writeStorage("silkscreenVisible", value);
  settings.renderSilkscreen = value;
  redrawIfInitDone();
}

function setHighlightPin1(value) {
  writeStorage("highlightpin1", value);
  settings.highlightpin1 = value;
  redrawIfInitDone();
}

function getStoredCheckboxRefs(checkbox) {
  function convert(ref) {
    var intref = parseInt(ref);
    if (isNaN(intref)) {
      for (var i = 0; i < pcbdata.modules.length; i++) {
        if (pcbdata.modules[i].ref == ref) {
          return i;
        }
      }
      return -1;
    } else {
      return intref;
    }
  }
  if (!(checkbox in settings.checkboxStoredRefs)) {
    var val = readStorage("checkbox_" + checkbox);
    settings.checkboxStoredRefs[checkbox] = val ? val : "";
  }
  if (!settings.checkboxStoredRefs[checkbox]) {
    return new Set();
  } else {
    return new Set(settings.checkboxStoredRefs[checkbox].split(",").map(r => convert(r)).filter(a => a >= 0));
  }
}

function getCheckboxState(checkbox, references) {
  var storedRefsSet = getStoredCheckboxRefs(checkbox);
  var currentRefsSet = new Set(references.map(r => r[1]));
  // Get difference of current - stored
  var difference = new Set(currentRefsSet);
  for (ref of storedRefsSet) {
    difference.delete(ref);
  }
  if (difference.size == 0) {
    // All the current refs are stored
    return "checked";
  } else if (difference.size == currentRefsSet.size) {
    // None of the current refs are stored
    return "unchecked";
  } else {
    // Some of the refs are stored
    return "indeterminate";
  }
}

function setBomCheckboxState(checkbox, element, references) {
  var state = getCheckboxState(checkbox, references);
  element.checked = (state == "checked");
  element.indeterminate = (state == "indeterminate");
}

function createCheckboxChangeHandler(checkbox, references, row) {
  return function() {
    refsSet = getStoredCheckboxRefs(checkbox);
    var darkenWhenChecked = settings.darkenWhenChecked == checkbox;
    eventArgs = {
      checkbox: checkbox,
      refs: references,
    }
    if (this.checked) {
      // checkbox ticked
      for (var ref of references) {
        refsSet.add(ref[1]);
      }
      if (darkenWhenChecked) {
        row.classList.add("checked");
      }
      eventArgs.state = 'checked';
    } else {
      // checkbox unticked
      for (var ref of references) {
        refsSet.delete(ref[1]);
      }
      if (darkenWhenChecked) {
        row.classList.remove("checked");
      }
      eventArgs.state = 'unchecked';
    }
    settings.checkboxStoredRefs[checkbox] = [...refsSet].join(",");
    writeStorage("checkbox_" + checkbox, settings.checkboxStoredRefs[checkbox]);
    updateCheckboxStats(checkbox);
    EventHandler.emitEvent(IBOM_EVENT_TYPES.CHECKBOX_CHANGE_EVENT, eventArgs);
  }
}

function clearHighlightedModules() {
  if (currentHighlightedRowId) {
    document.getElementById(currentHighlightedRowId).classList.remove("highlighted");
    currentHighlightedRowId = null;
    highlightedModules = [];
    highlightedNet = null;
  }
}

function createRowHighlightHandler(rowid, refs, net) {
  return function() {
    if (currentHighlightedRowId) {
      if (currentHighlightedRowId == rowid) {
        return;
      }
      document.getElementById(currentHighlightedRowId).classList.remove("highlighted");
    }
    document.getElementById(rowid).classList.add("highlighted");
    currentHighlightedRowId = rowid;
    highlightedModules = refs ? refs.map(r => r[1]) : [];
    highlightedNet = net;
    drawHighlights();
    EventHandler.emitEvent(
      IBOM_EVENT_TYPES.HIGHLIGHT_EVENT,
      {
        rowid: rowid,
        refs: refs,
        net: net
      });
  }
}

function entryMatches(entry) {
  if (settings.bommode == "netlist") {
    // entry is just a net name
    return entry.toLowerCase().indexOf(filter) >= 0;
  }
  // check refs
  for (var ref of entry[3]) {
    if (ref[0].toLowerCase().indexOf(filter) >= 0) {
      return true;
    }
  }
  // check extra fields
  for (var i in config.extra_fields) {
    if (entry[4][i].toLowerCase().indexOf(filter) >= 0) {
      return true;
    }
  }
  // check value
  if (entry[1].toLowerCase().indexOf(filter) >= 0) {
    return true;
  }
  // check footprint
  if (entry[2].toLowerCase().indexOf(filter) >= 0) {
    return true;
  }
  return false;
}

function findRefInEntry(entry) {
  return entry[3].filter(r => r[0].toLowerCase() == reflookup);
}

function highlightFilter(s) {
  if (!filter) {
    return s;
  }
  var parts = s.toLowerCase().split(filter);
  if (parts.length == 1) {
    return s;
  }
  var r = "";
  var pos = 0;
  for (var i in parts) {
    if (i > 0) {
      r += '<mark class="highlight">' +
        s.substring(pos, pos + filter.length) +
        '</mark>';
      pos += filter.length;
    }
    r += s.substring(pos, pos + parts[i].length);
    pos += parts[i].length;
  }
  return r;
}

function checkboxSetUnsetAllHandler(checkboxname) {
  return function() {
    var checkboxnum = 0;
    while (checkboxnum < settings.checkboxes.length &&
      settings.checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) {
      checkboxnum++;
    }
    if (checkboxnum >= settings.checkboxes.length) {
      return;
    }
    var allset = true;
    var checkbox;
    var row;
    for (row of bombody.childNodes) {
      checkbox = row.childNodes[checkboxnum + 1].childNodes[0];
      if (!checkbox.checked || checkbox.indeterminate) {
        allset = false;
        break;
      }
    }
    for (row of bombody.childNodes) {
      checkbox = row.childNodes[checkboxnum + 1].childNodes[0];
      checkbox.checked = !allset;
      checkbox.indeterminate = false;
      checkbox.onchange();
    }
  }
}

function createColumnHeader(name, cls, comparator) {
  var th = document.createElement("TH");
  th.innerHTML = name;
  th.classList.add(cls);
  th.style.cursor = "pointer";
  var span = document.createElement("SPAN");
  span.classList.add("sortmark");
  span.classList.add("none");
  th.appendChild(span);
  th.onclick = function() {
    if (currentSortColumn && this !== currentSortColumn) {
      // Currently sorted by another column
      currentSortColumn.childNodes[1].classList.remove(currentSortOrder);
      currentSortColumn.childNodes[1].classList.add("none");
      currentSortColumn = null;
      currentSortOrder = null;
    }
    if (currentSortColumn && this === currentSortColumn) {
      // Already sorted by this column
      if (currentSortOrder == "asc") {
        // Sort by this column, descending order
        bomSortFunction = function(a, b) {
          return -comparator(a, b);
        }
        currentSortColumn.childNodes[1].classList.remove("asc");
        currentSortColumn.childNodes[1].classList.add("desc");
        currentSortOrder = "desc";
      } else {
        // Unsort
        bomSortFunction = null;
        currentSortColumn.childNodes[1].classList.remove("desc");
        currentSortColumn.childNodes[1].classList.add("none");
        currentSortColumn = null;
        currentSortOrder = null;
      }
    } else {
      // Sort by this column, ascending order
      bomSortFunction = comparator;
      currentSortColumn = this;
      currentSortColumn.childNodes[1].classList.remove("none");
      currentSortColumn.childNodes[1].classList.add("asc");
      currentSortOrder = "asc";
    }
    populateBomBody();
  }
  return th;
}

function populateBomHeader() {
  while (bomhead.firstChild) {
    bomhead.removeChild(bomhead.firstChild);
  }
  var tr = document.createElement("TR");
  var th = document.createElement("TH");
  th.classList.add("numCol");
  tr.appendChild(th);
  var checkboxCompareClosure = function(checkbox) {
    return (a, b) => {
      var stateA = getCheckboxState(checkbox, a[3]);
      var stateB = getCheckboxState(checkbox, b[3]);
      if (stateA > stateB) return -1;
      if (stateA < stateB) return 1;
      return 0;
    }
  }
  if (settings.bommode == "netlist") {
    th = createColumnHeader("Net name", "bom-netname", (a, b) => {
      if (a > b) return -1;
      if (a < b) return 1;
      return 0;
    });
    tr.appendChild(th);
  } else {
    for (var checkbox of settings.checkboxes) {
      th = createColumnHeader(
        checkbox, "bom-checkbox", checkboxCompareClosure(checkbox));
      th.onclick = fancyDblClickHandler(
        th, th.onclick.bind(th), checkboxSetUnsetAllHandler(checkbox));
      tr.appendChild(th);
    }
    tr.appendChild(createColumnHeader("References", "References", (a, b) => {
      var i = 0;
      while (i < a[3].length && i < b[3].length) {
        if (a[3][i] != b[3][i]) return a[3][i] > b[3][i] ? 1 : -1;
        i++;
      }
      return a[3].length - b[3].length;
    }));
    // Extra fields
    if (config.extra_fields.length > 0) {
      var extraFieldCompareClosure = function(fieldIndex) {
        return (a, b) => {
          var fa = a[4][fieldIndex];
          var fb = b[4][fieldIndex];
          if (fa != fb) return fa > fb ? 1 : -1;
          else return 0;
        }
      }
      for (var i in config.extra_fields) {
        tr.appendChild(createColumnHeader(
          config.extra_fields[i], "extra", extraFieldCompareClosure(i)));
      }
    }
    tr.appendChild(createColumnHeader("Value", "Value", (a, b) => {
      return valueCompare(a[5], b[5], a[1], b[1]);
    }));
    tr.appendChild(createColumnHeader("Footprint", "Footprint", (a, b) => {
      if (a[2] != b[2]) return a[2] > b[2] ? 1 : -1;
      else return 0;
    }));
    if (settings.bommode == "grouped") {
      tr.appendChild(createColumnHeader("Quantity", "Quantity", (a, b) => {
        return a[3].length - b[3].length;
      }));
    }
  }
  bomhead.appendChild(tr);
}

function populateBomBody() {
  while (bom.firstChild) {
    bom.removeChild(bom.firstChild);
  }
  highlightHandlers = [];
  moduleIndexToHandler = {};
  netsToHandler = {};
  currentHighlightedRowId = null;
  var first = true;
  if (settings.bommode == "netlist") {
    bomtable = pcbdata.nets.slice();
  } else {
    switch (settings.canvaslayout) {
      case 'F':
        bomtable = pcbdata.bom.F.slice();
        break;
      case 'FB':
        bomtable = pcbdata.bom.both.slice();
        break;
      case 'B':
        bomtable = pcbdata.bom.B.slice();
        break;
    }
    if (settings.bommode == "ungrouped") {
      // expand bom table
      expandedTable = []
      for (var bomentry of bomtable) {
        for (var ref of bomentry[3]) {
          expandedTable.push([1, bomentry[1], bomentry[2], [ref], bomentry[4], bomentry[5]]);
        }
      }
      bomtable = expandedTable;
    }
  }
  if (bomSortFunction) {
    bomtable = bomtable.sort(bomSortFunction);
  }
  for (var i in bomtable) {
    var bomentry = bomtable[i];
    if (filter && !entryMatches(bomentry)) {
      continue;
    }
    var references = null;
    var netname = null;
    var tr = document.createElement("TR");
    var td = document.createElement("TD");
    var rownum = +i + 1;
    tr.id = "bomrow" + rownum;
    td.textContent = rownum;
    tr.appendChild(td);
    if (settings.bommode == "netlist") {
      netname = bomentry;
      td = document.createElement("TD");
      td.innerHTML = highlightFilter(netname ? netname : "&lt;no net&gt;");
      tr.appendChild(td);
    } else {
      if (reflookup) {
        references = findRefInEntry(bomentry);
        if (references.length == 0) {
          continue;
        }
      } else {
        references = bomentry[3];
      }
      // Checkboxes
      for (var checkbox of settings.checkboxes) {
        if (checkbox) {
          td = document.createElement("TD");
          var input = document.createElement("input");
          input.type = "checkbox";
          input.onchange = createCheckboxChangeHandler(checkbox, references, tr);
          setBomCheckboxState(checkbox, input, references);
          if (input.checked && settings.darkenWhenChecked == checkbox) {
            tr.classList.add("checked");
          }
          td.appendChild(input);
          tr.appendChild(td);
        }
      }
      // References
      td = document.createElement("TD");
      td.innerHTML = highlightFilter(references.map(r => r[0]).join(", "));
      tr.appendChild(td);
      // Extra fields
      for (var i in config.extra_fields) {
        td = document.createElement("TD");
        td.innerHTML = highlightFilter(bomentry[4][i]);
        tr.appendChild(td);
      }
      // Value
      td = document.createElement("TD");
      td.innerHTML = highlightFilter(bomentry[1]);
      tr.appendChild(td);
      // Footprint
      td = document.createElement("TD");
      td.innerHTML = highlightFilter(bomentry[2]);
      tr.appendChild(td);
      if (settings.bommode == "grouped") {
        // Quantity
        td = document.createElement("TD");
        td.textContent = bomentry[3].length;
        tr.appendChild(td);
      }
    }
    bom.appendChild(tr);
    var handler = createRowHighlightHandler(tr.id, references, netname);
    tr.onmousemove = handler;
    highlightHandlers.push({
      id: tr.id,
      handler: handler,
    });
    if (references !== null) {
      for (var refIndex of references.map(r => r[1])) {
        moduleIndexToHandler[refIndex] = handler;
      }
    }
    if (netname !== null) {
      netsToHandler[netname] = handler;
    }
    if ((filter || reflookup) && first) {
      handler();
      first = false;
    }
  }
  EventHandler.emitEvent(
    IBOM_EVENT_TYPES.BOM_BODY_CHANGE_EVENT,
    {
      filter: filter,
      reflookup: reflookup,
      checkboxes: settings.checkboxes,
      bommode: settings.bommode,
    });
}

function highlightPreviousRow() {
  if (!currentHighlightedRowId) {
    highlightHandlers[highlightHandlers.length - 1].handler();
  } else {
    if (highlightHandlers.length > 1 &&
      highlightHandlers[0].id == currentHighlightedRowId) {
      highlightHandlers[highlightHandlers.length - 1].handler();
    } else {
      for (var i = 0; i < highlightHandlers.length - 1; i++) {
        if (highlightHandlers[i + 1].id == currentHighlightedRowId) {
          highlightHandlers[i].handler();
          break;
        }
      }
    }
  }
  smoothScrollToRow(currentHighlightedRowId);
}

function highlightNextRow() {
  if (!currentHighlightedRowId) {
    highlightHandlers[0].handler();
  } else {
    if (highlightHandlers.length > 1 &&
      highlightHandlers[highlightHandlers.length - 1].id == currentHighlightedRowId) {
      highlightHandlers[0].handler();
    } else {
      for (var i = 1; i < highlightHandlers.length; i++) {
        if (highlightHandlers[i - 1].id == currentHighlightedRowId) {
          highlightHandlers[i].handler();
          break;
        }
      }
    }
  }
  smoothScrollToRow(currentHighlightedRowId);
}

function populateBomTable() {
  populateBomHeader();
  populateBomBody();
}

function modulesClicked(moduleIndexes) {
  var lastClickedIndex = moduleIndexes.indexOf(lastClicked);
  for (var i = 1; i <= moduleIndexes.length; i++) {
    var refIndex = moduleIndexes[(lastClickedIndex + i) % moduleIndexes.length];
    if (refIndex in moduleIndexToHandler) {
      lastClicked = refIndex;
      moduleIndexToHandler[refIndex]();
      smoothScrollToRow(currentHighlightedRowId);
      break;
    }
  }
}

function netClicked(net) {
  if (net in netsToHandler) {
    netsToHandler[net]();
    smoothScrollToRow(currentHighlightedRowId);
  } else {
    clearHighlightedModules();
    highlightedNet = net;
    drawHighlights();
  }
}

function updateFilter(input) {
  filter = input.toLowerCase();
  populateBomTable();
}

function updateRefLookup(input) {
  reflookup = input.toLowerCase();
  populateBomTable();
}

function changeCanvasLayout(layout) {
  document.getElementById("fl-btn").classList.remove("depressed");
  document.getElementById("fb-btn").classList.remove("depressed");
  document.getElementById("bl-btn").classList.remove("depressed");
  switch (layout) {
    case 'F':
      document.getElementById("fl-btn").classList.add("depressed");
      if (settings.bomlayout != "bom-only") {
        canvassplit.collapse(1);
      }
      break;
    case 'B':
      document.getElementById("bl-btn").classList.add("depressed");
      if (settings.bomlayout != "bom-only") {
        canvassplit.collapse(0);
      }
      break;
    default:
      document.getElementById("fb-btn").classList.add("depressed");
      if (settings.bomlayout != "bom-only") {
        canvassplit.setSizes([50, 50]);
      }
  }
  settings.canvaslayout = layout;
  writeStorage("canvaslayout", layout);
  resizeAll();
  changeBomMode(settings.bommode);
}

function populateMetadata() {
  document.getElementById("title").innerHTML = pcbdata.metadata.title;
  document.getElementById("revision").innerHTML = "Rev: " + pcbdata.metadata.revision;
  document.getElementById("company").innerHTML = pcbdata.metadata.company;
  document.getElementById("filedate").innerHTML = pcbdata.metadata.date;
  if (pcbdata.metadata.title != "") {
    document.title = pcbdata.metadata.title + " BOM";
  }
  // Calculate board stats
  var fp_f = 0, fp_b = 0, pads_f = 0, pads_b = 0, pads_th = 0;
  for (var i = 0; i < pcbdata.modules.length; i++) {
    if (pcbdata.bom.skipped.includes(i)) continue;
    var mod = pcbdata.modules[i];
    if (mod.layer == "F") {
      fp_f++;
    } else {
      fp_b++;
    }
    for (var pad of mod.pads) {
      if (pad.type == "th") {
        pads_th++;
      } else {
        if (pad.layers.includes("F")) {
          pads_f++;
        }
        if (pad.layers.includes("B")) {
          pads_b++;
        }
      }
    }
  }
  document.getElementById("stats-components-front").innerHTML = fp_f;
  document.getElementById("stats-components-back").innerHTML = fp_b;
  document.getElementById("stats-components-total").innerHTML = fp_f + fp_b;
  document.getElementById("stats-groups-front").innerHTML = pcbdata.bom.F.length;
  document.getElementById("stats-groups-back").innerHTML = pcbdata.bom.B.length;
  document.getElementById("stats-groups-total").innerHTML = pcbdata.bom.both.length;
  document.getElementById("stats-smd-pads-front").innerHTML = pads_f;
  document.getElementById("stats-smd-pads-back").innerHTML = pads_b;
  document.getElementById("stats-smd-pads-total").innerHTML = pads_f + pads_b;
  document.getElementById("stats-th-pads").innerHTML = pads_th;
  // Update version string
  document.getElementById("github-link").innerHTML = "InteractiveHtmlBom&nbsp;" +
    /^v\d+\.\d+/.exec(pcbdata.ibom_version)[0];
}

function changeBomLayout(layout) {
  document.getElementById("bom-btn").classList.remove("depressed");
  document.getElementById("lr-btn").classList.remove("depressed");
  document.getElementById("tb-btn").classList.remove("depressed");
  switch (layout) {
    case 'bom-only':
      document.getElementById("bom-btn").classList.add("depressed");
      if (bomsplit) {
        bomsplit.destroy();
        bomsplit = null;
        canvassplit.destroy();
        canvassplit = null;
      }
      document.getElementById("frontcanvas").style.display = "none";
      document.getElementById("backcanvas").style.display = "none";
      document.getElementById("bot").style.height = "";
      break;
    case 'top-bottom':
      document.getElementById("tb-btn").classList.add("depressed");
      document.getElementById("frontcanvas").style.display = "";
      document.getElementById("backcanvas").style.display = "";
      document.getElementById("bot").style.height = "calc(100% - 80px)";
      document.getElementById("bomdiv").classList.remove("split-horizontal");
      document.getElementById("canvasdiv").classList.remove("split-horizontal");
      document.getElementById("frontcanvas").classList.add("split-horizontal");
      document.getElementById("backcanvas").classList.add("split-horizontal");
      if (bomsplit) {
        bomsplit.destroy();
        bomsplit = null;
        canvassplit.destroy();
        canvassplit = null;
      }
      bomsplit = Split(['#bomdiv', '#canvasdiv'], {
        sizes: [50, 50],
        onDragEnd: resizeAll,
        direction: "vertical",
        gutterSize: 5
      });
      canvassplit = Split(['#frontcanvas', '#backcanvas'], {
        sizes: [50, 50],
        gutterSize: 5,
        onDragEnd: resizeAll
      });
      break;
    case 'left-right':
      document.getElementById("lr-btn").classList.add("depressed");
      document.getElementById("frontcanvas").style.display = "";
      document.getElementById("backcanvas").style.display = "";
      document.getElementById("bot").style.height = "calc(100% - 80px)";
      document.getElementById("bomdiv").classList.add("split-horizontal");
      document.getElementById("canvasdiv").classList.add("split-horizontal");
      document.getElementById("frontcanvas").classList.remove("split-horizontal");
      document.getElementById("backcanvas").classList.remove("split-horizontal");
      if (bomsplit) {
        bomsplit.destroy();
        bomsplit = null;
        canvassplit.destroy();
        canvassplit = null;
      }
      bomsplit = Split(['#bomdiv', '#canvasdiv'], {
        sizes: [50, 50],
        onDragEnd: resizeAll,
        gutterSize: 5
      });
      canvassplit = Split(['#frontcanvas', '#backcanvas'], {
        sizes: [50, 50],
        gutterSize: 5,
        direction: "vertical",
        onDragEnd: resizeAll
      });
  }
  settings.bomlayout = layout;
  writeStorage("bomlayout", layout);
  changeCanvasLayout(settings.canvaslayout);
}

function changeBomMode(mode) {
  document.getElementById("bom-grouped-btn").classList.remove("depressed");
  document.getElementById("bom-ungrouped-btn").classList.remove("depressed");
  document.getElementById("bom-netlist-btn").classList.remove("depressed");
  switch (mode) {
    case 'grouped':
      document.getElementById("bom-grouped-btn").classList.add("depressed");
      break;
    case 'ungrouped':
      document.getElementById("bom-ungrouped-btn").classList.add("depressed");
      break;
    case 'netlist':
      document.getElementById("bom-netlist-btn").classList.add("depressed");
  }
  writeStorage("bommode", mode);
  if (mode != settings.bommode) {
    settings.bommode = mode;
    bomSortFunction = null;
    currentSortColumn = null;
    currentSortOrder = null;
    clearHighlightedModules();
  }
  populateBomTable();
}

function focusFilterField() {
  focusInputField(document.getElementById("filter"));
}

function focusRefLookupField() {
  focusInputField(document.getElementById("reflookup"));
}

function toggleBomCheckbox(bomrowid, checkboxnum) {
  if (!bomrowid || checkboxnum > settings.checkboxes.length) {
    return;
  }
  var bomrow = document.getElementById(bomrowid);
  var checkbox = bomrow.childNodes[checkboxnum].childNodes[0];
  checkbox.checked = !checkbox.checked;
  checkbox.indeterminate = false;
  checkbox.onchange();
}

function checkBomCheckbox(bomrowid, checkboxname) {
  var checkboxnum = 0;
  while (checkboxnum < settings.checkboxes.length &&
    settings.checkboxes[checkboxnum].toLowerCase() != checkboxname.toLowerCase()) {
    checkboxnum++;
  }
  if (!bomrowid || checkboxnum >= settings.checkboxes.length) {
    return;
  }
  var bomrow = document.getElementById(bomrowid);
  var checkbox = bomrow.childNodes[checkboxnum + 1].childNodes[0];
  checkbox.checked = true;
  checkbox.indeterminate = false;
  checkbox.onchange();
}

function setBomCheckboxes(value) {
  writeStorage("bomCheckboxes", value);
  settings.checkboxes = value.split(",").filter((e) => e);
  prepCheckboxes();
  populateBomTable();
  populateDarkenWhenCheckedOptions();
}

function setDarkenWhenChecked(value) {
  writeStorage("darkenWhenChecked", value);
  settings.darkenWhenChecked = value;
  populateBomTable();
}

function prepCheckboxes() {
  var table = document.getElementById("checkbox-stats");
  while (table.childElementCount > 1) {
    table.removeChild(table.lastChild);
  }
  if (settings.checkboxes.length) {
    table.style.display = "";
  } else {
    table.style.display = "none";
  }
  for (var checkbox of settings.checkboxes) {
    var tr = document.createElement("TR");
    var td = document.createElement("TD");
    td.innerHTML = checkbox;
    tr.appendChild(td);
    td = document.createElement("TD");
    td.id = "checkbox-stats-" + checkbox;
    var progressbar = document.createElement("div");
    progressbar.classList.add("bar");
    td.appendChild(progressbar);
    var text = document.createElement("div");
    text.classList.add("text");
    td.appendChild(text);
    tr.appendChild(td);
    table.appendChild(tr);
    updateCheckboxStats(checkbox);
  }
}

function populateDarkenWhenCheckedOptions() {
  var container = document.getElementById("darkenWhenCheckedContainer");

  if (settings.checkboxes.length == 0) {
    container.parentElement.style.display = "none";
    return;
  }

  container.innerHTML = '';
  container.parentElement.style.display = "inline-block";

  function createOption(name, displayName) {
    var id = "darkenWhenChecked-" + name;

    var div = document.createElement("div");
    div.classList.add("radio-container");

    var input = document.createElement("input");
    input.type = "radio";
    input.name = "darkenWhenChecked";
    input.value = name;
    input.id = id;
    input.onchange = () => setDarkenWhenChecked(name);
    div.appendChild(input);

    // Preserve the selected element when the checkboxes change
    if (name == settings.darkenWhenChecked) {
      input.checked = true;
    }

    var label = document.createElement("label");
    label.innerHTML = displayName;
    label.htmlFor = id;
    div.appendChild(label);

    container.appendChild(div);
  }
  createOption("", "None");
  for (var checkbox of settings.checkboxes) {
    createOption(checkbox, checkbox);
  }
}

function updateCheckboxStats(checkbox) {
  var checked = getStoredCheckboxRefs(checkbox).size;
  var total = pcbdata.modules.length - pcbdata.bom.skipped.length;
  var percent = checked * 100.0 / total;
  var td = document.getElementById("checkbox-stats-" + checkbox);
  td.firstChild.style.width = percent + "%";
  td.lastChild.innerHTML = checked + "/" + total + " (" + Math.round(percent) + "%)";
}

document.onkeydown = function(e) {
  switch (e.key) {
    case "n":
      if (document.activeElement.type == "text") {
        return;
      }
      if (currentHighlightedRowId !== null) {
        checkBomCheckbox(currentHighlightedRowId, "placed");
        highlightNextRow();
        e.preventDefault();
      }
      break;
    case "ArrowUp":
      highlightPreviousRow();
      e.preventDefault();
      break;
    case "ArrowDown":
      highlightNextRow();
      e.preventDefault();
      break;
    default:
      break;
  }
  if (e.altKey) {
    switch (e.key) {
      case "f":
        focusFilterField();
        e.preventDefault();
        break;
      case "r":
        focusRefLookupField();
        e.preventDefault();
        break;
      case "z":
        changeBomLayout("bom-only");
        e.preventDefault();
        break;
      case "x":
        changeBomLayout("left-right");
        e.preventDefault();
        break;
      case "c":
        changeBomLayout("top-bottom");
        e.preventDefault();
        break;
      case "v":
        changeCanvasLayout("F");
        e.preventDefault();
        break;
      case "b":
        changeCanvasLayout("FB");
        e.preventDefault();
        break;
      case "n":
        changeCanvasLayout("B");
        e.preventDefault();
        break;
      default:
        break;
    }
    if (e.key >= '1' && e.key <= '9') {
      toggleBomCheckbox(currentHighlightedRowId, parseInt(e.key));
    }
  }
}

function hideNetlistButton() {
  document.getElementById("bom-ungrouped-btn").classList.remove("middle-button");
  document.getElementById("bom-ungrouped-btn").classList.add("right-most-button");
  document.getElementById("bom-netlist-btn").style.display = "none";
}

window.onload = function(e) {
  initUtils();
  initRender();
  initStorage();
  initDefaults();
  cleanGutters();
  populateMetadata();
  dbgdiv = document.getElementById("dbg");
  bom = document.getElementById("bombody");
  bomhead = document.getElementById("bomhead");
  filter = "";
  reflookup = "";
  if (!("nets" in pcbdata)) {
    hideNetlistButton();
  }
  initDone = true;
  prepCheckboxes();
  // Triggers render
  changeBomLayout(settings.bomlayout);

  // Users may leave fullscreen without touching the checkbox. Uncheck.
  document.addEventListener('fullscreenchange', () => {
    if (!document.fullscreenElement)
      document.getElementById('fullscreenCheckbox').checked = false;
  });
}

window.onresize = resizeAll;
window.matchMedia("print").addListener(resizeAll);

///////////////////////////////////////////////

///////////////////////////////////////////////

///////////////////////////////////////////////
  </script>
</head>

<body>

<div id="topmostdiv" class="topmostdiv">
  <div id="top">
    <div style="float: right; height: 100%;">
      <div class="hideonprint menu" style="float: right; top: 8px;">
        <button class="menubtn"></button>
        <div class="menu-content">
          <label class="menu-label menu-label-top" style="width: calc(50% - 18px)">
            <input id="darkmodeCheckbox" type="checkbox" onchange="setDarkMode(this.checked)">
            Dark mode
          </label><!-- This comment eats space! All of it!
          --><label class="menu-label menu-label-top" style="width: calc(50% - 17px); border-left: 0;">
            <input id="fullscreenCheckbox" type="checkbox" onchange="setFullscreen(this.checked)">
            Full Screen
          </label>
          <label class="menu-label" style="width: calc(50% - 18px)">
            <input id="fabricationCheckbox" type="checkbox" checked onchange="fabricationVisible(this.checked)">
            Fab layer
          </label><!-- This comment eats space! All of it!
          --><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
            <input id="silkscreenCheckbox" type="checkbox" checked onchange="silkscreenVisible(this.checked)">
            Silkscreen
          </label>
          <label class="menu-label" style="width: calc(50% - 18px)">
            <input id="referencesCheckbox" type="checkbox" checked onchange="referencesVisible(this.checked)">
            References
          </label><!-- This comment eats space! All of it!
          --><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
            <input id="valuesCheckbox" type="checkbox" checked onchange="valuesVisible(this.checked)">
            Values
          </label>
          <div id="tracksAndZonesCheckboxes">
            <label class="menu-label" style="width: calc(50% - 18px)">
              <input id="tracksCheckbox" type="checkbox" checked onchange="tracksVisible(this.checked)">
              Tracks
            </label><!-- This comment eats space! All of it!
            --><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
              <input id="zonesCheckbox" type="checkbox" checked onchange="zonesVisible(this.checked)">
              Zones
            </label>
          </div>
          <label class="menu-label" style="width: calc(50% - 18px)">
            <input id="padsCheckbox" type="checkbox" checked onchange="padsVisible(this.checked)">
            Pads
          </label><!-- This comment eats space! All of it!
          --><label class="menu-label" style="width: calc(50% - 17px); border-left: 0;">
            <input id="dnpOutlineCheckbox" type="checkbox" checked onchange="dnpOutline(this.checked)">
            DNP outlined
          </label>
          <label class="menu-label">
            <input id="highlightpin1Checkbox" type="checkbox" onchange="setHighlightPin1(this.checked)">
            Highlight first pin
          </label>
          <label class="menu-label">
            <input id="dragCheckbox" type="checkbox" checked onchange="setRedrawOnDrag(this.checked)">
            Continuous redraw on drag
          </label>
          <label class="menu-label">
            <span>Board rotation</span>
            <span style="float: right"><span id="rotationDegree">0</span>&#176;</span>
            <input id="boardRotation" type="range" min="-36" max="36" value="0" class="slider" oninput="setBoardRotation(this.value)">
          </label>
          <label class="menu-label">
            <div style="margin-left: 5px">Bom checkboxes</div>
            <input id="bomCheckboxes" class="menu-textbox" type=text
                   oninput="setBomCheckboxes(this.value)">
          </label>
          <label class="menu-label">
            <div style="margin-left: 5px">Darken when checked</div>
            <div id="darkenWhenCheckedContainer"></div>
          </label>
          <label class="menu-label">
            <span class="shameless-plug">
              <span>Created using</span>
              <a id="github-link" target="blank" href="https://github.com/openscopeproject/InteractiveHtmlBom">InteractiveHtmlBom</a>
            </span>
          </label>
        </div>
      </div>
      <div class="button-container hideonprint"
           style="float: right; position: relative; top: 8px">
        <button id="fl-btn" class="left-most-button" onclick="changeCanvasLayout('F')"
                title="Front only">F
        </button>
        <button id="fb-btn" class="middle-button" onclick="changeCanvasLayout('FB')"
                title="Front and Back">FB
        </button>
        <button id="bl-btn" class="right-most-button" onclick="changeCanvasLayout('B')"
                title="Back only">B
        </button>
      </div>
      <div class="button-container hideonprint"
           style="float: right; position: relative; top: 8px">
        <button id="bom-btn" class="left-most-button" onclick="changeBomLayout('bom-only')"
                title="BOM only"></button>
        <button id="lr-btn" class="middle-button" onclick="changeBomLayout('left-right')"
                title="BOM left, drawings right"></button>
        <button id="tb-btn" class="right-most-button" onclick="changeBomLayout('top-bottom')"
                title="BOM top, drawings bot"></button>
      </div>
      <div class="button-container hideonprint"
           style="float: right; position: relative; top: 8px">
        <button id="bom-grouped-btn" class="left-most-button" onclick="changeBomMode('grouped')"
                title="Grouped BOM"></button>
        <button id="bom-ungrouped-btn" class="middle-button" onclick="changeBomMode('ungrouped')"
                title="Ungrouped BOM"></button>
        <button id="bom-netlist-btn" class="right-most-button" onclick="changeBomMode('netlist')"
                title="Netlist"></button>
      </div>
      <div class="hideonprint menu" style="float: right; top: 8px;">
        <button class="statsbtn"></button>
        <div class="menu-content">
          <table class="stats">
            <tbody>
              <tr>
                <td width="40%">Board stats</td>
                <td>Front</td>
                <td>Back</td>
                <td>Total</td>
              </tr>
              <tr>
                <td>Components</td>
                <td id="stats-components-front">~</td>
                <td id="stats-components-back">~</td>
                <td id="stats-components-total">~</td>
              </tr>
              <tr>
                <td>Groups</td>
                <td id="stats-groups-front">~</td>
                <td id="stats-groups-back">~</td>
                <td id="stats-groups-total">~</td>
              </tr>
              <tr>
                <td>SMD pads</td>
                <td id="stats-smd-pads-front">~</td>
                <td id="stats-smd-pads-back">~</td>
                <td id="stats-smd-pads-total">~</td>
              </tr>
              <tr>
                <td>TH pads</td>
                <td colspan=3 id="stats-th-pads">~</td>
              </tr>
            </tbody>
          </table>
          <table class="stats">
            <col width="40%"/><col />
            <tbody id="checkbox-stats">
              <tr>
                <td colspan=2 style="border-top: 0">Checkboxes</td>
              </tr>
            </tbody>
          </table>
        </div>
      </div>
      <div class="hideonprint menu" style="float: right; top: 8px;">
        <button class="iobtn"></button>
        <div class="menu-content">
          <div class="menu-label menu-label-top">
            <div style="margin-left: 5px;">Save board image</div>
            <div class="flexbox">
              <input id="render-save-width" class="menu-textbox" type="text" value="1000" placeholder="Width"
                  style="flex-grow: 1; width: 50px;" oninput="validateSaveImgDimension(this)">
              <span>X</span>
              <input id="render-save-height" class="menu-textbox" type="text" value="1000" placeholder="Height"
                  style="flex-grow: 1; width: 50px;" oninput="validateSaveImgDimension(this)">
            </div>
            <label>
              <input id="render-save-transparent" type="checkbox">
              Transparent background
            </label>
            <div class="flexbox">
              <button class="savebtn" onclick="saveImage('F')">Front</button>
              <button class="savebtn" onclick="saveImage('B')">Back</button>
            </div>
          </div>
          <div class="menu-label">
            <span style="margin-left: 5px;">Config and checkbox state</span>
            <div class="flexbox">
              <button class="savebtn" onclick="saveSettings()">Export</button>
              <button class="savebtn" onclick="loadSettings()">Import</button>
            </div>
          </div>
        </div>
      </div>
    </div>
    <div id="fileinfodiv" style="overflow: auto;">
      <table class="fileinfo">
        <tbody>
          <tr>
            <td id="title" class="title" style="width: 70%">
              Title
            </td>
            <td id="revision" class="title" style="width: 30%">
              Revision
            </td>
          </tr>
          <tr>
            <td id="company">
              Company
            </td>
            <td id="filedate">
              Date
            </td>
          </tr>
        </tbody>
      </table>
    </div>
  </div>
  <div id="bot" class="split" style="height: calc(100% - 80px)">
    <div id="bomdiv" class="split split-horizontal">
      <div style="width: 100%">
        <input id="reflookup" class="textbox searchbox reflookup hideonprint" type="text" placeholder="Ref lookup"
               oninput="updateRefLookup(this.value)">
        <input id="filter" class="textbox searchbox filter hideonprint" type="text" placeholder="Filter"
               oninput="updateFilter(this.value)">
        <div class="button-container hideonprint" style="float: left; margin: 0;">
          <button id="copy" title="Copy bom table to clipboard"
               onclick="copyToClipboard()"></button>
        </div>
      </div>
      <div id="dbg"></div>
      <table class="bom">
        <thead id="bomhead">
        </thead>
        <tbody id="bombody">
        </tbody>
      </table>
    </div>
    <div id="canvasdiv" class="split split-horizontal">
      <div id="frontcanvas" class="split" touch-action="none" style="overflow: hidden">
        <div style="position: relative; width: 100%; height: 100%;">
          <canvas id="F_bg" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>
          <canvas id="F_fab" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
          <canvas id="F_slk" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>
          <canvas id="F_hl" style="position: absolute; left: 0; top: 0; z-index: 3;"></canvas>
        </div>
      </div>
      <div id="backcanvas" class="split" touch-action="none" style="overflow: hidden">
        <div style="position: relative; width: 100%; height: 100%;">
          <canvas id="B_bg" style="position: absolute; left: 0; top: 0; z-index: 0;"></canvas>
          <canvas id="B_fab" style="position: absolute; left: 0; top: 0; z-index: 1;"></canvas>
          <canvas id="B_slk" style="position: absolute; left: 0; top: 0; z-index: 2;"></canvas>
          <canvas id="B_hl" style="position: absolute; left: 0; top: 0; z-index: 3;"></canvas>
        </div>
      </div>
    </div>
  </div>
</div>

</body>

</html>
